五种排序的分析与实现方法
摘 要 排序是数据处理应用中最普遍的一种操作。本文举例对冒泡排序法、插入排序法、选择排序法、快速排序法、希尔排序法进行了分析并说明了实现方法。在解决实际问题的过程中,应根据不同的情况,选择合适的排序算法。
【关键词】排序 算法 时间复杂度 程序 元素
排序(Sorting)也称为分类,是将一组含有几个元素的无序的数据排列成有序的序列。排序是数据处理中最普遍应用的一种操作,经过排序的数据可采用优化的算法提高程序执行的效率;增加数据输出的清晰度,便于信息检索;同时经过排序后的数据往往还含一些特殊的意义,为用户提供有价值的信息。排序算法除了在数据处理中具有一定的实际价值外,掌握排序的算法及其依据的原则,可以给学习程序设计人员以启迪,以便在实际应用中能够灵活运用更简洁、更高效的程序设计算法。
1 排序问题
对于程序设计的排序问题可以归纳为:
(1)已知一个具有n个记录的文件F;
(2)记录{R1,R2,…,Rn}都包含许多数据项;
(3)记录{R1,R2,…,Rn}都包含一个关键项Ka;
(4)任意两个记录之间Ra和Rb的次序关系唯一地由两个关键项Ka和Kb的值确定;
(5)利用等于、先于、后于三种次序关系,将F中的记录物理次序重新排列。
2 排序方法
为了便于描述,将文件F设定为含N个整型数据的数组,重点讨论排序算法。含多个数据项的按同样算法实现。
2.1 冒泡排序法(Bubble Sort)
冒泡排序法是一种简单的、基本的排序方法。它的思想是重复地扫描要排序的数列,一次比较两个相邻元素,如果他们的顺序违背规则就把他们进行交换。这样进行若干遍处理,直到全部排好为止。
例如:将{29,23,15,47,05}按从小到大排列
初始关键字: 29 23 15 47 05
第一趟排序后:23 15 29 05 [47]
第二趟排序后:15 23 05 [29 47]
第三趟排序后:15 05 [23 29 47]
第四趟排序后:05 [15 23 29 47]
结 果:05 [15 23 29 47]
从上例可以看出,在该排序中,若需排序的数据为正序,则只进行一次排序即可。若需排序的数据为逆序,则需进行N-1轮排序。需排序的序列为一随机数列,则比较的次数是上述两种情况的平均数值,时间复杂度为0(N2)。
用C程序实现冒泡排序算法的函数:
void Bubble_Sort(int a[],int N)
{for(int j=0;j for(int i=0;i {if(a[i]>a[i+1]) {int temp=a[i]; a[i]=a[i+1]; a[i+1]=temp;}} } 2.2 插入排序法(Insert Sort) 插入排序法是一种比较直观的排序方法。它的思想是以第一元素作为有序序列,从第二个元素开始,依次将每一个元素插入到这个有序的序列中,从而使全部数据有序。 例如:将{29,23,15,47,05}按从小到大排列 初始关键字: 29 23 15 47 05 第一趟排序后:[29] 23 15 47 05 第二趟排序后:[23 29] 15 47 05 第三趟排序后:[15 23 29] 47 05 第四趟排序后:[15 23 29 47] 05 结 果:[05 15 23 29 47] 从上例可以看出,在该排序中,若需排序的数据为正序,则比较的次数为N-1次。若需排序的数据为逆序,则最多比较的次数(N+2) (N-1)/2次。需排序的序列为一随机数列,则比较的次数是上述两种情况的平均数值,时间复杂度为0(N2)。 用C程序实现插入排序算法的函数: void Insert_Sort(int a[],int N)