C语言学习(七)冒泡排序,选择排序

今天讲的比较难的点事冒泡和选择排序,结合代码和自己的理解总结了一下。

语言中,常用的算法有:冒泡排序、快速排序、插入排序、选择排序、希尔排序、堆排序以及归并排序等等。

                   冒泡排序法(Bubblesort) 

所谓排序法,就是对一组无序的序列进行有序的排序(从大到小或者从小到大),那么什么叫冒泡排序法,冒泡排序法又是怎么实现数组的有序排列呢。

冒泡排序法的具体实现方法是这样的,从数组的第一个元素`a[0]`开始,两两比较**(`a[j],a[j+1]`),如果前面的数大于后面的数(`a[j] > a[j+1]`),那么交换两个元素的位置,把大的数往后移动。这样依次经过一轮比较以后,最大的数将会被交换到最后的位置(a[j-1])。

先一起再来看看冒泡排序法是怎么排序的。
  
 第1次循环     1 2 3 4 5 6 7 8 9 0 
 弟2次循环     2 3 4 5 6 7 8 9 1 
 第3次循环     3 4 5 6 7 8 9 2 
 第4次循环     4 5 6 7 8 9 3 
 第5次循环     5 6 7 8 9 4 
 第6次循环     6 7 8 9 5 
 第7次循环     7 8 9 6  
 第8次循环     8 9 7
 第9次循环     9 
可以看到,每一轮的排序,在这一轮中参与比较的元素中最大的数将会浮到最后。而冒泡排序的名字也是从这里来的 。

冒泡排序

#include <stdio.h>

 

int main()

{

    int i,j;

    int temp;

    int a[10]={0,1,2,3,4,5,6,7,8,9};随机定义数组

 int len = sizeof(a) / sizeof(int);//计算元素的个数  

    for(i = 0;i < len - 1;i++)//循环次数为元素的数量减一,最后一个元素不需要单独运行一次

    {

        for(j = 0;j < len - i -1;j++)//由于后面的已经排列所以每次比较的次数变少

        {

                if(a[j] < a[j + 1])//作用是把大的数放到数组的后面

                   {

                       temp = a[j];

                       a[j] = a[j + 1];

                       a[j + 1] = temp;

                 }

}

for(j = 0;j < 10;j++)//循环输出

{

    printf("%d ",a[j]);

}

printf("\n");

    }

 

    return 0;

}

                   选择排序法(Selectionsort)

所谓的选择是什么意思呢,选择就是于万千花丛中择其一,在选择排序法中说的就是,每一次循环过程中,通过比较选择出你需要的**最值**。

选择排序法的过程是,通**过比较,选择出每一轮中最值元素,然后把他和这一轮中最最前面的元素交换**,所以这个算法关键是要记录每次比较的结果,即每次比较后最值位置(下标)。

先来看看选择排序的过程:

第1次排序    1 3 6 7 8 5 4 9 2 10 
第2次排序   1 2 6 7 8 5 4 9 3 10 
第3次排序    1 2 3 7 8 5 4 9 6 10
第4次排序    1 2 3 4 8 5 7 9 6 10
第5次排序   1 2 3 4 5 8 7 9 6 10 
第6次排序   1 2 3 4 5 8 7 9 6 10 
第7次排序   1 2 3 4 5 6 7 9 8 10
第8次排序   1 2 3 4 5 6 7 8 9 10 
第9次排序   1 2 3 4 5 6 7 8 9 10

选择排序

#include <stdio.h>

int main()

{

    int a[10] = {10,3,6 ,7, 8 ,5 ,4 ,9, 2 ,1};       //随机定义一个数组  

    int i,j;

    int min;

    int len = sizeof(a) / sizeof(int);//计算数组元素的个数

  for(i = 0;i < len -1;i++)//循环的次数是元素个数减一,因为前面位置确定,最后一位不需要比较或pai排序

  {

        min = i;//引入min,用来确定最小值的位置

  for(j = i + 1;j < len;j++)//起点为下一位,用来和qian前一位比较

 {

       if(a[min] > a[j])

         {

            min = j;//本循环作用为确定最小值

        }

}

        if(min != i)

{

    int temp = a[i];

    a[i] = a[min];

    a[min] = temp;

}//把该最小值按次序放入数组

for(j = 0;j < len;j++)

{

    printf("%d ",a[j]);

}//循环输出数组

printf("\n");//换行,增强可读性

    }

    return 0;

}

猜你喜欢

转载自blog.csdn.net/ls_dashang/article/details/81191479