最近闲来无事,复习了下一些排序算法,温故知新!
首先,温故:
维基上的排序算法定义
其次,推荐两个有意思的算法排序算法网站:
优快云上看到的一些帖子:
是不是该取消冒泡排序与插入排序(这个,还是保留得好!)
关于希尔排序的的“间隔”设置的说明,从书上摘抄下来:
在希尔(人名)的原稿中,他建议初始的间距为N/2,简单地把每一趟排序分成了两半。因些,对于N=100的数组逐渐减小的间隔序列为:50,25,12,6,3,1。这个方法的好处是不需要在开始排序前为找到初始的间隔而计算序列;而只需要用2整除N。但是,这被证明并不是最好的数列。尽管对于大多数的数据来说这个方法还是比插入排序效果好,但是这种方法有时会使运行时间降到O(N^2),这并不比插入排序的效率更高。
这个方法的一个变形是用2.2而非2来整除每一个间隔。对于n=100的数组来说,会产生序列45,20,9,4,1。这比用2整除显著改善了效果,因为这样避免了某些导致时间复杂度为O(N^2)的最坏情况的发生。不论N为何值,都需要一些额外的代码来保证序列的最后取值为1。
间隔序列中的数字互质通常被认为很重要:也就是说,除了1之外它们没有公约数。这个约束条件使每一趟排序更有可能保持前一趟排序已经排好的效果。希尔最初以N/2为间隔的低效性就是归咎于它没有遵守这个准则。
或许还可以设计出像如上讲述的间隔序列一样好的(甚至更好的)间隔序列。但是不管这个间隔序列是什么,都应该能够快速地计算,而不会降低算法的执行速度。
不知道在哪里看到这句:
当相等的元素是无法分辨的,比如像是整数,稳定度并不是一个问题。
快排笑而不语~~~
简介(有些比书上讲得明白):
冒泡排序:http://developer.51cto.com/art/201104/256382.htm
插入排序:http://developer.51cto.com/art/201104/256362.htm
选择排序:http://developer.51cto.com/art/201104/256371.htm
归并排序:http://developer.51cto.com/art/201104/256410.htm
希尔排序:http://developer.51cto.com/art/201104/256391.htm
快速排序:http://developer.51cto.com/art/201104/256428.htm
基数排序:http://developer.51cto.com/art/201104/256449.htm
堆排序: http://developer.51cto.com/art/201104/256420.htm
这里说到了几个改进的排序算法(VBA):
http://club.excelhome.net/thread-661033-1-1.html
总结,怎样选择排序算法:
通过对一些排序算法性能的分析和比较,我们可以得出如下结论:
1. 当排序记录数n较大时,若要求排序稳定,则采用归并排序;
2. ------------------------------,关键字分布随机,而且不要求稳定性,可采用快速排序;
3. ------------------------------,关键字会出现正、逆序情况,可采用堆排序或归并排序;
4. 当排序记录数n较小时,记录已接近有序或随机分布时,又要求排序稳定,可采用直接插入排序;
5. ------------------------------,且对稳定性不作要求时,可采用直接选择排序;