内部排序是指在排序期间数据元素全部存放在内存的排序。外部排序是指在排序期间全部元素的个数过多,不能同时存放在内存,必须根据排序过程的要求,不断在内存和外存之间移动的排序。本次主要介绍常见的内部排序算法。
直接插入排序的算法思想是把待排序序列a[n]中的n个元素看作是一个有序表和无序表。开始时有序表中只包含第一个元素a[0],无序表中包含n-1个元素a[1]~a[n-1],排序过程中每次从无序表中拿出第一个元素,把它插入有序表的适当位置,使之成为新的有序表,有序表中的元素个数加1。这样经过n-1次插入后,无序表变成空表,有序表中包含了全部n个元素,排序完毕。直接插入排序算法的实现代码如下:
折半插入排序也称二分法排序,其算法思想是设数据表中有一个元素序列a[0],a[1],...,a[n-1]。其中,a[0],a[1],...,a[i-1]已经排好序。在插入a[i]时,利用折半查找寻找在有序表a[0]~a[i-1]内a[i]的插入位置。折半插入排序算法的实现代码如下:
希尔排序也称缩小增量排序,其算法思想是设待排序元素序列有n个元素,首先取一个整数gap<n作为间隔,将全部元素分为gap个子序列,所有距离为gap的元素放入同一个子序列中,对每个子序列分别进行直接插入排序。然后缩小gap,如gap取gap/2.重复上述子序列的划分和排序操作,直到gap取1,将所有元素放在同一个子序列中为止。希尔排序算法的实现代码如下:
简单选择排序也称直接选择排序,其主要算法思想是设待排序元素序列有n个元素,第一趟排序从待排序序列中选取排序码最小的元素,若它不是第一个元素,则与待排序序列的第一个元素交换,并将它从待排序序列中删除,第二趟排序从剩下的待排序序列中再次选取排序码最小的元素,重复上述过程,总共通过n-1趟排序,得到一个有序序列。简单选择排序算法的实现代码如下:
锦标赛排序是一种树形选择排序,按照锦标赛的思想进行选择排序,其算法思想是首先对n个元素的排序码进行两两比较,得到n/2个优胜者(排序码较小者),作为第一步比较的结果保留下来,然后对这n/2个元素再进行两两比较。如此重复,直至选出具有最小排序码的元素为止。这个过程可以用一棵含有n个叶子结点的完全二叉树表示。底层相当于完全二叉树的叶节点,他们存放的是所有参加排序元素的排序码。非叶子节点存放的是叶子结点排序码进行两两比较后优胜者的叶节点编号。最顶层是树的根,存放的是最后选出的具有最小排序码的元素所在叶节点编号,这种树称为胜者树。锦标赛排序算法的实现代码如下:
堆排序的基本思想是:1、将带排序的序列构造成一个大顶堆,根据大顶堆的性质,当前堆的根节点(堆顶)就是序列中最大的元素;2、将堆顶元素和最后一个元素交换,然后将剩下的节点重新构造成一个大顶堆;3、重复步骤2,如此反复,从第一次构建大顶堆开始,每一次构建,我们都能获得一个序列的最大值,然后把它放到大顶堆的尾部。最后,就得到一个有序的序列了。堆排序算法的实现代码如下:
冒泡排序算法思想是比较相邻的元素,如果第一个比第二个大,就交换他们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。所以,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。冒泡排序算法的实现代码如下:
快速排序的基本思想是通过一趟排序将要排序的数据分割成独立的两部分:分割点左边都是比它小的数,右边都是比它大的数。然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序算法的实现代码如下:
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。进而将两个有序表合并成一个有序表,也被称为二路归并。归并排序算法的实现代码如下:
基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。基数排序算法的实现代码如下: