八大排序概念分析

本文介绍的插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序均属于内部排序

*内部排序:在内存中进行排序处理

*外部排序:因数据庞大,需要访问外存进行处理数据

(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

2.链式基数排序

未完待续。。。。

猜你喜欢

转载自blog.csdn.net/mountain_hua/article/details/80779646