排序算法有许多: 冒泡排序\选择排序\插入排序\归并排序\快速排序\桶排序-基数排序\希尔排序\堆排序\二叉树排序
例如从小到大排序:
1. 冒泡排序 与 选择排序:
冒泡排序像是打点滴时进入点滴中管的空气,要一点一点的浮到上面,不会跳过任何一个位置
冒泡排序是相近两个比较 A1<>A2<>A3<>...<>An, 从而逐步把最大值交换到最后,得到数字最大值,放到了An (n-1次比较)
再次比较A1<>A2<>A3...<>An-1,从而得到一个次大值,放到An-1 (n-2次比较)
选择排序与冒泡排序比较像:
选择排序像是选体重最轻的/选武力最强的:选前两个比,比胜的留下继续往下比,直到比到最后一个
使用A1<>A2 A1<> A3 ... A1<>An,从而一次次把比较出的小值放入A1,最后得到最小值放入A1 (n-1次比较)
再次比较A2<>A3 ... A2<>An,得到此小值放入A2 (n-2次比较)
这两种的比较数量级一致
a. 不同的时一个先得到最大值然后依次得到次大值,一个先得到最小值然后得到次小值
b. 不同的是一个是相近两个元素比,另一个一个元素跟其他元素依次比
总比较次数 = (n-1) + (n-2) + ... 2 = (n-1)(n-1+2)/2
交换次数:不定,不用分配额外存储
2. 插入排序(InsertSort)
插入排序的经典例子就是打牌时,我们都习惯把牌按大小排一排,看到小的在后面,就拿出来插入前面合适的位置。
第一轮排序:A2<>A1,小的放前面
第二轮排序:A3<>A2 [A2<>A1] 如果A3<A2,交换了,才需要A2与A1比较
第三轮排序:A4<>A3 [A3<>A2 [A2<>A1]] 如果A4<A3,交换了,才需要A3与A2比较,如果A3<A2,交换了,才需要A2与A1比较
...
第n-1轮排序:An<>An-1 [...]
插入排序也是只对最近两个互相比,不会隔着其他元素比,这点和冒泡排序一样。
比较过程中:例如key = Aj需要放到前面,则依次把Aj-1,Aj-2,Aj-3的值向后一个元素到Aj, Aj-1,Aj-2 [A1.... -> -> ->Aj ... An],然后把key放入Aj-1
3. 归并排序MergeSort 与 快速排序QuickSort
归并排序原理是一分为二排序(递归),排序结果归并
归并逻辑,两个排序后序列:
10 30
(9) 14
/(6) (8)
/(3) /(2) 2, 3, 6 ... 比较一次,得到一个当前最小值
n个元素被二分的次数为 lg(n)
归并排序结果的时间复杂度为 O(n*lg(n)),n越大效率越高
快速排序:
选定第一个数为分割数字 key = A1
An <> key [ An-1 <> key [An-2 <>A1]...] An < key时,A1、An互换,不再继续比较An-1
A2 <> key [ A3 <> key [ A4<> key]...] A2 > key时,A2 与key所在元素互换,不再继续比较A3
...
比较一轮后(所有元素都参与了),把元素分割到了( 小于key元素集合, key所在元素, 大于key元素集合)
对分割的两部分快速排序(递归)
快速排序性能比较好,但算法复杂度不太稳定,n较大情况下,平均性能高于冒泡,低于归并排序,但不使用额外存储,比较常用。
快速排序和归并排序都是用递归算法,针对大数据量,性能也都比较不错
4. 基数排序
基数排序也叫桶排序,很有意思
先按个位数排序,个位相同的放在同一桶里面
再按十位数排序,十位相同的按之前排的顺序放在同一桶里面
...
最后按最高位排序,最高位相同的按之前排的顺序放入同一个桶里面
然后从0-9个桶里面顺序取就得到排序结果了。这个其实和现实中我们人眼排序的效果类似,比完高位比低位,最后比到个位
5. 希尔排序
希尔排序是插入排序的优化版,插入排序如果后面比较小,要挨个交换到前面,交换消耗比较大。
希尔排序解决了这个问题,采用
Step = (n+1)/2,A1 与 A(1+Step)比较,A2与A(2+Step)比较 ...
下一次Step = (Step+1)/2,与 A(1+Step)比较,A2与A(2+Step)比较
...
Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源