本文介绍的插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序均属于内部排序
*内部排序:在内存中进行排序处理
*外部排序:因数据庞大,需要访问外存进行处理数据
(1)插入排序(直接插入,二分插入,希尔排序等)
1.直接插入排序
对于要排序的数据,将系列分成两部分,左边关键字有序,右边无序,每次选择右边的第一个数据插入左边的适当位置。
直接插入排序是一种稳定的排序算法。
例:将序列{7,9,5,8,3,4}按照升序排序,排序过程如下:
7,9,5,8,3,4>>>9,7,5,8,3,4>>>9,7,5,8,3,4>>>9,8,7,5,3,4>>>9,8,7,5,3,4>>>9,8,7,5,4,3
2.二分插入排序
二分插入排序与直接插入排序类似,不过是在先确定好位置之后,一次性地将数据往后移动。
二分插入排序也是一种稳定的排序算法。
3.希尔排序
希尔排序又称缩小增量排序,方法如下:
先选取一个小于数据个数n的步长di,然后把待排序的序列分为di个组,从第一个记录开始,间隔为di的记录为一组,分组之后,在每一组中采用直接插入排序或者二分插入排序进行排序即可。
希尔排序是一种不稳定的排序算法。
(2)交换排序(冒泡排序,快速排序等)
1.冒泡排序
冒泡排序的基本思想是基于两两比较和交换,每次冒泡出一个最大的或者最小的数据。方法如下:
对于长度为n的序列,先比较第一个数据和第二个数据的大小,如果不满足排序条件,则交换,接下来比较第二个数据和第三个数据的大小,如果不满足排序条件,则交换,这样一直比较到第n-1和第n个数据,就冒出了最大值或者最小值,这是第一趟冒泡。第二趟冒泡就一直比较到第n-2和第n-1个数据,冒出了倒数第二大或者倒数第二小的值。重复这个操作,直到整个序列有序。
冒泡排序是一种稳定的排序算法
算法如下(升序):
①i=1,j=1
②如果a[j]>a[j+1],则交换
③如果j<n-i,则j++,返回②
④i++,如果i<n,则j=1返回②
⑤结束
2.改进后的冒泡排序
存在这样一一种情况,冒泡过程中,后面的若干记录没有发生交换,这时候再继续进行冒泡就显得多此一举了,那么我们只需要记录没有发生交换的位置,对这个位置之后的数据不进行冒泡处理,只对这个位置之前的数据进行冒泡处理,提升算法的效率。
3.快速排序
快速排序的基本思想是:
(升序)以某个记录的关键字为划分元,将整个数据分为两组,左边的数据小于等于划分元,右边的数据大于等于划分元。对左右两组数据,再各自选择一个划分元,将两组数据划分为更小的序列,这样一直进行下去,直到整个序列有序。
快速排序是一种不稳定的排序算法
(3)选择排序
1.简单选择排序
基本思想是:
第一趟从长度为n的序列中选择关键字最大(或最小)的记录与第一个记录交换;
第二趟从长度为n-1的序列中选择关键字最大(或最小)的记录与第二个记录交换;
.....
依次进行下去,知道第n-1趟完成,整个序列就按关键字有序
2.树形选择排序
树形选择排序也称为锦标赛排序。因其排序过程按锦标赛比赛规则进行排序,基本思想是:
将所有的n个数据看成一颗完全二叉树的叶子结点,首先在叶子结点间两两比较,胜出的进入上一层继续和兄弟结点进行比较,如果没有兄弟结点,则直接进入上一层,一直到第二层的兄弟结点比较后,决出第一名。为了产生第二名,可将刚刚产生的第一名的叶子结点置为最小值,然后再进行比较,得到第二名,依次进行下去,可得到第三、第四......最终得到所有排名。
3.堆排序
(4)归并排序
归并排序分为2路归并和多路归并,而2路归并一般用在内部排序中,多路归并一般用在外部磁盘排序中。这里只接受2路归并
基本思想:
将两个有序表合成一个更大的有序表。
2路归并递归算法:
2路并归迭代算法:
(5)基数排序
基数排序是基于分配——收集的排序算法,它利用的是多关键字的排序思想。
1.多关键字排序
uy