嵌入式Linux C编程学习之路(五)——基础排序算法

2019-07-12 16:41发布

      在进行排序算法时经常用到交换两个数组元素的功能,将这个功能单独写成一个子函数,采用传引用调用的参数传递方式,对数组元素的地址直接进行操作,达到改变其位置的功能。代码如下: void swap(int*p,int*q) { int a; a=*p; *p=*q; *q=a; } 一:选择排序
    将要排序的对象分作两部份,一个是已排序的,一个是未排序的,从后端未排序部份选择一个最小值,并放入前端已排序部份的最后一个。 void slef(int a[]) { int i,j,k; for(i=0;i<9;i++)//选择第i位,将其他位依次与他相比较 { for(j=1+i;j<10;j++)//其他位选择 { if(a[j]<=a[i])//当其他的位存在比第i位小的数时, {swap(&a[j],&a[i]);//交换 } } printf("第 %d 次排序:", i+1); for(k = 0; k < 10; k++) printf("%d ", a[k]); printf(" "); } } 运行结果如下:  [root@loc paixu]# ./a.out 4 第 1 次排序:6 95 90 49 80 58 27 9 18 50 第 2 次排序:6 9 95 90 80 58 49 27 18 50 第 3 次排序:6 9 18 95 90 80 58 49 27 50 第 4 次排序:6 9 18 27 95 90 80 58 49 50 第 5 次排序:6 9 18 27 49 95 90 80 58 50 第 6 次排序:6 9 18 27 49 50 95 90 80 58 第 7 次排序:6 9 18 27 49 50 58 95 90 80 第 8 次排序:6 9 18 27 49 50 58 80 95 90 第 9 次排序:6 9 18 27 49 50 58 80 90 95 二:插入排序
       像是玩朴克一样,我们将牌分作两堆,每次从后面一堆的牌抽出最前端的牌,然后插入前面一堆牌的适当位置。  void ins(int a[]) { int i,j,k,tmp; for(j = 1; j < 10; j++) { tmp = a[j]; i=j; while(tmp 运行结果如下:  [root@loc paixu]# ./a.out 5 第 1 次排序:27 95 90 49 80 58 6 9 18 50 第 2 次排序:27 90 95 49 80 58 6 9 18 50 第 3 次排序:27 49 90 95 80 58 6 9 18 50 第 4 次排序:27 49 80 90 95 58 6 9 18 50 第 5 次排序:27 49 58 80 90 95 6 9 18 50 第 6 次排序:6 27 49 58 80 90 95 9 18 50 第 7 次排序:6 9 27 49 58 80 90 95 18 50 第 8 次排序:6 9 18 27 49 58 80 90 95 50 第 9 次排序:6 9 18 27 49 50 58 80 90 95 三:气泡排序法
       顾名思义,就是排序时,最大的元素会如同气泡一样移至右端,其利用比较相邻元素的方法,将大的元素交换至右端,所以大的元素会不断的往右移动,直到适当的位置为止。 void paos(int a[]) { int i,j,k,f=1; for(j=0;j<9&&f==1;j++) {f=0; for(i=0;i<9-j;i++) { if(a[i]>a[i+1]) { swap(&a[i],&a[i+1]); f=1; } } printf("第 %d 次排序:",j+1); for(k = 0; k < 10; k++) printf("%d ", a[k]); printf(" "); } } 运行结果如下 : [root@loc paixu]# ./a.out 6 第 1 次排序:27 90 49 80 58 6 9 18 50 95 第 2 次排序:27 49 80 58 6 9 18 50 90 95 第 3 次排序:27 49 58 6 9 18 50 80 90 95 第 4 次排序:27 49 6 9 18 50 58 80 90 95 第 5 次排序:27 6 9 18 49 50 58 80 90 95 第 6 次排序:6 9 18 27 49 50 58 80 90 95 第 7 次排序:6 9 18 27 49 50 58 80 90 95       冒泡排序时,当某次排序不发生数组元素交换时,则排序位完成,这是即可终止排序以减少程序运行时间,代码中通过设置一个标志符f来判断是否产生交换。 附:主函数   int main() { int b=0; int a[10]={95,27,90,49,80,58,6,9,18,50}; scanf("%d",&b); if(4==b) { slef(a); } if(5==b) { ins(a); } if(6==b) { paos(a); } else { return 0; } }