七种经典排序算法小记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013043408/article/details/86058903

首先要感谢MoreWindows的心得分享。通过他的文章,我更深入了解了这七种排序算法的思路。同时,也自己揣摩,手动敲代码实现了这些算法。为了加深理解,又给每一行代码加了注释。
在此,特记下学习这七种排序算法的过程和心得。

补充:冒泡排序、直接选择排序、直接插入排序、希尔排序、快速排序、归并排序、堆排序。

一、参考文献

MoreWindows 大牛的文献库

静默星空 大牛的文献库

本人学习排序算法过程中的测试代码+详细注释+性能测试报告(怎么不能免费下载了,最低1积分?)

二、结合参考文献学习后的心得

1、冒泡排序
遍历数组,通过比较相邻两个数,使大数在后。重复n-1次,可以使数组有序。

1、冒泡排序改进1
在冒泡排序经典的基础上,判断每一次遍历是否发生了数据交换。若有,则说明数据依然无序。若没有,则说明数组已经有序。

1、冒泡排序改进2
在冒泡排序改进1的基础上,在每一次遍历中,记录最后一次发生数据交换的位置endPos,下一次遍历忽略endPos之后的数。

2、直接选择排序
将数组分为有序区和无序区,初始有序区长度为0,无序区长度为n。然后,从无序区中找出最小数,与无序区首位置交换。这样,该首位置也就归入有序区。有序区长度加1,无序区长度减一。重复n-1次,可以使数组有序。

3、直接插入排序
将数组分为有序区和无序区,初始有序区长度为1,无序区长度为n-1。然后,将无序区的第一个数插入到有序区的合适位置,使有序区依然有序。这样,有序区长度加一,无序区长度减一。重复n-1次,可以使数组有序。

3、经典直接插入排序具体做法
在有序区中,从尾向头找一个位置pos,使左边的数小于无序区第一个数;
将无序区第一个数缓存到temp;
将有序区中pos及之后的数向后平移一位;
将temp赋值到pos位置;
有序区长度加一,无序区长度减一,重复之前步骤,直到无序区长度为0;

3、改进直接插入排序具体做法
将无序区第一个数缓存到temp;
在有序区中,从尾向头遍历数组,若当前数大于temp,则当前数向后平移一位。若当前数
小于temp,则将temp赋值到当前数后一个位置;
有序区长度加一,无序区长度减一,重复之前步骤,直到无序区长度为0;

4、希尔排序
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

4、希尔排序具体做法
初始增量gap = 数组长度n / 2 ,将数组中,所有 距离为 gap的倍数 的数分为一组,对每组使用直接插入排序算法排序。然后,更新增量gap = gap/2,重复分组-排序过程。直到增量gap为1,进行最后一次排序,可以使数组有序。

5、快速排序
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

6、归并排序
先使每个子序列有序,再使子序列段间有序。
疑惑:代码中,合并两个子序列时,使用memcpy把临时缓存拷贝到目标内存,排序结果错误。

7、堆排序
将数组调整成大顶堆结构。然后,堆顶与堆尾数据交换。堆节点数“减一”,从根节点调整堆。重复n-1 次,数组有序。

三、性能比较(仅供参考)

排序对象:50000个随机数(随机数种子相同)
快速排序 > 希尔排序改进1 > 归并排序 > 堆排序 > 希尔排序经典 > 插入排序经典> 直接选择排序 > 冒泡排序经典

大礼包
测试代码+详细注释+性能测试报告

猜你喜欢

转载自blog.csdn.net/u013043408/article/details/86058903