【编程学习】算法之排序小结

原创 2016年05月31日 21:57:34

上一篇文章总结了一下算法,顺便还说了说为什么要学算法和算法的一些基本特征,这篇文章就来总结一下我目前所了解的排序算法。

首先,国际惯例:

一、什么是排序算法?

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源。在各个领域中考虑到数据的各种限制和规范,要得到一个符合实际的优秀算法,得经过大量的推理和分析。

二、排序算法都包括什么内容?

1、分类:(1)稳定的:

冒泡排序(bubble sort) — O(n^2)
鸡尾酒排序(Cocktail sort,双向的冒泡排序) — O(n^2)
插入排序(insertion sort)— O(n^2)
桶排序(bucket sort)— O(n); 需要 O(k) 额外空间
计数排序(counting sort) — O(n+k); 需要 O(n+k) 额外空间
合并排序(merge sort)— O(nlog n); 需要 O(n) 额外空间
原地合并排序— O(n^2)
二叉排序树排序 (Binary tree sort) — O(nlog n)期望时间; O(n^2)最坏时间; 需要 O(n) 额外空间
鸽巢排序(Pigeonhole sort) — O(n+k); 需要 O(k) 额外空间
基数排序(radix sort)— O(n·k); 需要 O(n) 额外空间
Gnome 排序— O(n^2)
图书馆排序— O(nlog n) with high probability,需要 (1+ε)n额外空间

(2)不稳定的:

选择排序(selection sort)— O(n^2)
希尔排序(shell sort)— O(nlog n) 如果使用最佳的现在版本
组合排序— O(nlog n)
堆排序(heapsort)— O(nlog n)
平滑排序— O(nlog n)
快速排序(quicksort)— O(nlog n) 期望时间,O(n^2) 最坏情况; 对于大的、乱数列表一般相信是最快的已知排序
Introsort— O(nlog n)
Patience sorting— O(nlog n+ k) 最坏情况时间,需要 额外的 O(n+ k) 空间,也需要找到最长的递增子串行(longest increasing subsequence)

(3)不实用的:

Bogo排序— O(n× n!) 期望时间,无穷的最坏情况。
Stupid sort— O(n^3); 递归版本需要 O(n^2) 额外存储器
珠排序(Bead sort) — O(n) or O(√n),但需要特别的硬件
Pancake sorting— O(n),但需要特别的硬件
stooge sort——O(n^2.7)很漂亮但是很耗时

2、常见的排序算法:

插入排序
插入排序是这样实现的:
1、首先新建一个空列表,用于保存已排序的有序数列(我们称之为"有序列表")。
2、从原数列中取出一个数,将其插入"有序列表"中,使其仍旧保持有序状态。
3、重复2号步骤,直至原数列为空。
插入排序的平均时间复杂度为平方级的,效率不高,但是容易实现。它借助了"逐步扩大成果"的思想,使有序列表的长度逐渐增加,直至其长度等于原列表的长度。
插入排序的基本思想是在遍历数组的过程中,假设在序号 i 之前的元素即 [0..i-1] 都已经排好序,本趟需要找到 i 对应的元素 x 的正确位置 k ,并且在寻找这个位置 k 的过程中逐个将比较过的元素往后移一位,为元素 x “腾位置”,最后将 k 对应的元素值赋为 x ,一般情况下,插入排序的时间复杂度和空间复杂度分别为 O(n2 ) 和 O(1)。[1] 
冒泡排序
冒泡排序是这样实现的:
1、从列表的第一个数字到倒数第二个数字,逐个检查:若某一位上的数字大于他的下一位,则将它与它的下一位交换。
2、重复1号步骤,直至再也不能交换。
冒泡排序的平均时间复杂度与插入排序相同,也是平方级的,但冒泡排序是原地排序的,也就是说它不需要额外的存储空间。
选择排序
选择排序是这样实现的:
1、设数组内存放了n个待排数字,数组下标从1开始,到n结束。
2、初始化i=1
3、从数组的第i个元素开始到第n个元素,寻找最小的元素。
4、将上一步找到的最小元素和第i位元素交换。
5、i++,直到i=n-1算法结束,否则回到第3步
选择排序的平均时间复杂度也是O(n^2)的。
举例:
564
比如说这个,我想让它从小到大排序,怎么做呢?
第一步:从第一位开始找最小的元素,564中4最小,与第一位交换。结果为465
第二步:从第二位开始找最小的元素,465中5最小,与第二位交换。结果为456
第三步:i=2,n=3,此时i=n-1,算法结束
完成
快速排序
现在开始,我们要接触高效排序算法了。实践证明,快速排序是所有排序算法中最高效的一种。它采用了分治的思想:先保证列表的前半部分都小于后半部分,然后分别对前半部分和后半部分排序,这样整个列表就有序了。这是一种先进的思想,也是它高效的原因。因为在排序算法中,算法的高效与否与列表中数字间的比较次数有直接的关系,而"保证列表的前半部分都小于后半部分"就使得前半部分的任何一个数从此以后都不再跟后半部分的数进行比较了,大大减少了数字间不必要的比较。但查找数据得另当别论了。
时间复杂度
平均时间复杂度
插入排序 O(n^2)
冒泡排序 O(n^2)
选择排序 O(n^2)
快速排序 O(n log n)
堆排序 O(n log n)
归并排序 O(n log n)
基数排序 O(n)
希尔排序 O(n^1.25)

三、

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

九大排序算法小结(复杂度)

九大排序算法小结      前面分别实现了几大排序算法的代码,但并未进行解析 现在就从算法的时间复杂度,空间复杂度进行谈起 下面这幅图是网上考培...

排序算法小结(python 实现)

排序算法

排序算法小结(一)

排序算法的执行时间是衡量算法好坏的最重要的参数。排序的时间开销可用算法执行中的数据比较次数与数据移动次数来衡量。1、冒泡排序算法void bubbleSort(int a[], int n){ fo...

Java -- 算法小结之希尔排序

希尔排序是在插入排序的基础之上做的优化。那什么是希尔排序呢? 我们知道,再插入排序的时候,如果这个数组基本是有序的,那么数组间数值的移动就会少很多,那么相应的效率就会提高。 希尔的规则是将已有的数...
  • wxy318
  • wxy318
  • 2015年06月28日 10:14
  • 354

各种排序算法小结和实现

各种排序算法想必大家都不陌生,定义我就不多介绍了,直接写下自己的一些小结。快速排序:可以算的上应用最广的排序算法。其排序思路是随机选取一个数字作为标志,使得小于它的数在它左边,大于它的数在它的右边,然...
  • hyp1977
  • hyp1977
  • 2016年05月10日 16:35
  • 623

排序算法小结(C#)

插入排序 1.简介 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入...

常用排序算法小结(附Java实现)

常用排序算法小记 排序算法很多地方都会用到,近期又重新看了一遍算法,并自己简单地实现了一遍,特此记录下来,为以后复习留点材料。 废话不多说,下面逐一看看经典的排序算法:   1. 选择排序 ...

Notes: 排序算法小结 (Sorting)

最近两天,复习了几个经典的排序算法。在这里,写一份小结,粗略回顾。 1)Bubble Sort 顾名思义,就是把最小的数如冒泡一样,在每次的遍历当中,移到最顶的位置。 public void Bu...

排序算法小结(Concept)

总结一下目前学过的所有排序算法: 1 冒泡排序 2 选择排序 3 快速排序 4 插入排序 5 希尔排序 6 堆排序 7 计数排序 8 合并排序 9 基数排序 10 桶排序 排...

Java -- 算法小结之快速排序

快排算法,是很经典的一种算法,大概有这么几步 1 以需要排序范围第一个元素为关键值。 2 先从右往左查找,直到第一个小于关键值的元素,将此元素和关键值交换,并记下下标。 3 然后从左往右查找,直到找到...
  • wxy318
  • wxy318
  • 2015年06月23日 23:09
  • 230
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【编程学习】算法之排序小结
举报原因:
原因补充:

(最多只允许输入30个字)