通常,在程序中的数据处理时,会用到各种算法来进行处理,以达到提高抗干扰、过滤等作用。本文主要介绍在排序算法中的最经典、最常用的冒泡和选择排序算法。
(一) 冒泡排序
这个名词的由来很好理解,一般在河水、水杯里的气泡往上冒,就叫做冒泡,气泡刚冒
出来的时候是比较小的,随着慢慢向水面浮起会逐渐增大,大家只需要了解即可。
冒泡排序的原理:
冒泡排序对相邻元素进行两两比较,如果顺序不对,就要对其位置进行调换,一直到排序完成。比如第一趟比较:首先比较第一个和第二个数的大小,将小数放前,大数放后。然后比较第二个数和第三个数的大小,再将小数放前,大数放后。以此类推,直到比较完最后两个数,第一趟就比较完了。重复第一趟过程,若有n个数,就要比较n-1趟。
在c语言中可以使用双重循环,外层循环控制比较多少趟,内层循环每一趟比较的次数。
(图片来自网上)
算法代码:
#include<stdio.h> #define N 6 int main() { int a[N],i,j,t; for(i=0;i<N;i++) scanf("%d",&a[i]); for(i=0;i<N-1;i++) { for(j=1;j<N-i;j++) { if(a[j-1]>a[j]) { t=a[j-1];a[j-1]=a[j];a[j]=t; } } } printf("The sorted numbers: \n"); for(i=0;i<N;i++) printf("%d ",a[i]); return 0; }
冒泡排序缺点:
但是冒泡排序也有一定的缺点,就是在比较过程中小的数不能一次到位,会导致效率低。所以一般不会选择冒泡排序,虽然冒泡排序书写是最简单的,但是平均性能是没有选择排序排序好的。
(二) 选择排序
选择排序是每一次从待排序的数据元素中选出最小的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
选择排序的原理:
若有n个数,第一轮排序从1~n个数中找到最小的数,与第一个数进行交换,第二轮排序从2~n个书中找到最小的数,与第二个数进行交换。以此类推,经过n-1轮的处理将会得到n个数的由小到大排序。
(图片来自网上)
算法代码:
#include<stdio.h> #define N 5 int main() { int a[N],i,j,k,t; printf("Input numbers:\n"); for(i=0;i<N;i++) scanf("%d",&a[i]); for(i=0;i<N-1;i++) { k=i; for(j=i+1;j<N;j++) if(a[k]>a[j])k=j; if(k!=i) { t=a[i];a[i]=a[k];a[k]=t; } } printf("The sorted numbers: \n"); for(i=0;i<N;i++) printf("%d ",a[i]); return 0; }
选择排序同样有着耗时长的问题,只是排序法就有一大堆(插入法排序、希尔法排序),更何况还有其它的,这是一条不归路啊。未完待续。。。。。。