【算法研究】排序算法
2012-11-20 16:59
169 查看
排序算法分类:
分类方法一:
简单排序(包括冒泡、插入、直接插入等),分治排序(快速、归并等)
分类二:
插入排序类(直接插入、shell排序)
交换排序类(冒泡、快速)
选择排序(直接选择、堆排序、选择书归并)
分配排序(桶排序、基数排序、索引排序)
1、直接插入排序
原地算法
最差时间复杂度O(n2)(原序列为逆序)
平均时间复杂度O(n2)
最佳时间复杂度O(n)(原序列是顺序)
对于短序列,直接插入排序比较有效
可以实现稳定排序
2、shell排序(缩小增量排序法)
利用了插入排序的两个优点(正序列排序时间O(n);对短序列较为有效)
效率比直接插入排序高。
增量序列需要考虑。
如果增量每次除以2递减,效果不佳。(原因:增量之间不互质)。平均时间复杂度是O(n2)。
如果采用hibbard的增量序列{2^k-1, 2^(k-1)-1, ....7,3,1}, 时间为O(n^3/2)
如果增量每次除以3递减,时间为O(n^3/2)
注意:最后要用增量为1的插入排序扫尾
非稳定排序
3、 冒泡排序
思想:不停比较相邻的记录,如果不满足排序要求,交换。一趟又一趟,直到所有的记录都排好序为止。
可以用NoSwap指示变量。如果某一趟没有交换,则不需要再冒泡了
可以实现稳定排序
最大、平均时间代价均为O(n2)
分类方法一:
简单排序(包括冒泡、插入、直接插入等),分治排序(快速、归并等)
分类二:
插入排序类(直接插入、shell排序)
交换排序类(冒泡、快速)
选择排序(直接选择、堆排序、选择书归并)
分配排序(桶排序、基数排序、索引排序)
1、直接插入排序
原地算法
最差时间复杂度O(n2)(原序列为逆序)
平均时间复杂度O(n2)
最佳时间复杂度O(n)(原序列是顺序)
对于短序列,直接插入排序比较有效
可以实现稳定排序
2、shell排序(缩小增量排序法)
利用了插入排序的两个优点(正序列排序时间O(n);对短序列较为有效)
效率比直接插入排序高。
增量序列需要考虑。
如果增量每次除以2递减,效果不佳。(原因:增量之间不互质)。平均时间复杂度是O(n2)。
如果采用hibbard的增量序列{2^k-1, 2^(k-1)-1, ....7,3,1}, 时间为O(n^3/2)
如果增量每次除以3递减,时间为O(n^3/2)
注意:最后要用增量为1的插入排序扫尾
非稳定排序
3、 冒泡排序
思想:不停比较相邻的记录,如果不满足排序要求,交换。一趟又一趟,直到所有的记录都排好序为止。
可以用NoSwap指示变量。如果某一趟没有交换,则不需要再冒泡了
可以实现稳定排序
最大、平均时间代价均为O(n2)
相关文章推荐
- 无限级目录树最优算法的新研究
- 经典算法研究系列:四、教你通透彻底理解:BFS和DFS优先搜索算法
- 程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大系列集锦
- SSD中一种地址映射算法研究
- 第2章 算法基础-----排序算法
- July-程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大经典原创系列集锦与总结
- 算法研究之合并两个已排序的数组java版
- 【C++研发面试笔记】19. 常用算法-排序算法
- 经典算法研究系列:一、A*搜索算法
- 算法系列(四)排序算法中篇--归并排序和快速排序
- Regular Expression算法研究
- 几个经典算法研究
- 图像算法---磨皮算法研究汇总
- 经典算法研究系列:三、动态规划算法解微软一道面试题[第56题]
- 经典算法研究系列:六、教你初步了解KMP算法、updated
- 【数据结构与算法】【排序算法】排序算法总结
- 利用正则表达式解析新闻网页的算法研究
- 算法--排序算法总结
- 通过分析 JDK 源代码研究 TreeMap 红黑树算法实现
- 经典算法研究系列:七、深入浅出遗传算法,透析GA本质