排序,是程序设计中经常碰到的问题,排序算法的好坏与性能直接挂钩
而本着一种“不重复造*”的精神,下面对排序算法的介绍,给的很多都是相关博客链接,同时也是为了方便自己以后的复习。不过也谨记,链接中的博客也有可能会出错,不保证完全正确,但确实能够帮助理解关键思想,只是提供的代码可能会略有不足。永远记住,代码实现不止一种。而自己以后有时间也会在此博客上一点一点的改进。
排序算法总览:
十种排序算法总结(冒泡、插入、选择、希尔、归并、堆、快速,计数,桶,基数)
大神William-Hai的各种排序算法的github源码:
直接入正题:
一、冒泡排序
基本算法思想:通过循环遍历,多次比较相邻两个数的大小,符合条件就交换位置
可参考:
二、插入排序
(一)直接插入排序
基本算法思想:把待排序的纪录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的纪录插入完为止,得到一个新的有序序列
可参考:
(二)折半插入排序(二分插入排序)
基本算法思想:折半插入排序(binary insertion sort)是对直接插入排序算法的一种改进,由于前半部分为已排好序的数列,这样我们不用按顺序依次寻找插入点,可以采用折半查找的方法来加快寻找插入点的速度。
可参考:
(三)希尔排序
基本算法思想:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。
可参考:
三、选择排序
基本算法思想:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕
可参考:
四、快速排序
基本算法思想:是对冒泡排序的一种改进。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
可参考:
五、归并排序
基本算法思想:归并排序是创建在归并操作上的一种有效的排序算法。先递归分解有序数列(把单独一个数看做有序数列),再对有序数列进行有序合并。
可参考:
六、堆排序
基本算法思想:利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。谨记先对所给数列进行堆化,再进行堆排序。
可参考:
七、计数排序
基本算法思想:计数排序(Counting sort)是一种稳定的线性时间排序算法。计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。
可参考:
八、桶排序
基本算法思想:桶排序(Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。
可参考:
九、基数排序
基本算法思想:基数排序(英语:Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。
可参考: