快速排序 常考排序算法

冒泡排序是交換排序,它是非常慢的,比起幾種簡單排序,例如選擇,插入排序。冒泡排序的時間性能要差的多。因爲總要交換數據,只是兩個兩個的比,不僅邏輯判斷多,交換數據的頻次也高。

 但交換排序就如此失敗嗎。不,它反而是很成功的,因爲它有個頂樑柱。那就是快速排序。
 快速排序聽着就很快,實際效果來說更快,如果再加入優化,那就快上天了,如果再把幾種優化一融合。也許,這就是排序中的王者吧!
今天先不談及優化,就拿最原始的快排來說。先學着走才能跑啊。太急於求成會摔跟頭的。
我們知道冒泡排序總是兩個兩個比,反序交換,順序就使遍歷往後走。
這種方法太過原始了。
所以我們就想如何能升級一下呢。
因此有了快速排序

快速排序是什麼原理呢,就是把數列分成無數個小段,使每段都有序,且第n-1個小段的最後一個數總比第n個小段的第一個數要小(或相等)。這樣下來不就有序了嗎。

分段很簡單,隨便的遞歸和循環就可以做到,但是 令初次接觸快排的人 毫無頭緒的是,怎麼才能做到在每段都有序的情況下
使前面的段的結尾  比  後面的段的開頭
 小呢?
我們可以在分的時候做些手腳,那就是使分段那個點左邊的數據全部小於此點,右邊的數據全部大於此點。
那就有人會想,那雖然保證了右半段的最小的數據也比左邊最大的數據要大,但卻不能保證每段數據的有序性啊。
比如 9 8 1 2 5  6  7 3 4
 數列以5爲樞點劃分下來 是 3  4
 1  1  2
     5
      6 7 8
 9
 但5的左右兩段數列怎麼排序呢。
難道還要引入其他的排序方法來輔佐嗎?
其實不用引用其他的排序,(但如果優化會用到,目前先不說)
我們只要將它們不斷的分下去,直到每段的長度爲1,那不就每段數列都有序了嗎(一個數據的數列是有序的),而且也保證了後一段比前一段大。那不就是每前一個數比後一個數小嗎。如果是升序,那不就有序了嗎。
所以說快速排序的分而治之的思想使用遞歸來理解是很簡單的,因此本次算法就使用了遞歸,當然循環也是可以的,其實循環更高級,相當於對快速排序的一種優化!
以下爲代碼:
快速排序---排序中的強者

以下爲一次Quick圖解
快速排序---排序中的強者

最後返回i的值,即中間數的下標(分段點,樞點)
以下爲10萬個隨即數據測試:
快速排序---排序中的強者

時間複雜度   最好情況 和平均情況 爲0(nlog2n)  
最差情況爲 0(n^2)
快速排序是不穩定的,不但指 保證相同數據
前後關係的穩定性是不穩定的,也指它排序的性能其實也並不穩定,對於完全亂序,數據很多的數列來說,它是很強悍的。但對於短小的數據,或者基本有序的數據來說,它由於多次遞歸和很多邏輯判斷邏輯循環,它甚至不如簡單排序來的快。所以說目前來說並沒有完全完美的排序方式,即使給快速排序加了很多優化,它的輔助空間也會大大增加,邏輯判斷次數也會增多。
爲什麼說快速排序很厲害,那是因爲目前的信息爆炸的時代,大部分情況下需要處理的數據是很多的,也很複雜,這就很對快速排序的胃口。如果你讓我定義一個長度爲10的數組
讓 快速排序 和 直接插入排序比,那就是被吊打。
因此不同的情況選擇最適應排序纔是最好的。但也不排除一些很通用的排序,比如歸併排序,它的效率就非常的穩定,排序的效率不會非常非常快,但也不會非常非常慢。如果對排序時間穩定性有要求的話,歸併未嘗不是一個很好的選擇。