排序算法随笔

排序算法有许多: 冒泡排序\选择排序\插入排序\归并排序\快速排序\桶排序-基数排序\希尔排序\堆排序\二叉树排序

 

例如从小到大排序:

 

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  转载请标明来源 

 

你可能感兴趣的:(冒泡排序,归并排序,快速排序,选择排序,排序算法)