快速排序(quick sort)通過一個切分元素将數組分為兩個子數組,左子數組小于等于切分元素,右子數組大于等于切分元素,将這兩個子數組排序也就将整個數組排序了。
從數列中挑出一個元素,稱為 "基準"(pivot);
重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分區退出之後,該基準就處于數列的中間位置。這個稱為分區(partition)操作;
遞歸地(recursive)把小于基準值元素的子數列和大于基準值元素的子數列排序;

快速排序是原地排序,不需要輔助數組,但是遞歸調用需要輔助棧。
最壞情況下,第一次從最小的元素切分,第二次從第二小的元素切分,如此這般。是以最壞的情況下需要比較 N^2/2。為了防止數組最開始就是有序的,在進行快速排序時需要随機打亂數組。
快速排序的最壞運作情況是 O(n²),比如說順序數列的快排。但它的平攤期望時間是 O(nlogn),且 O(nlogn) 記号中隐含的常數因子很小,比複雜度穩定等于 O(nlogn) 的歸并排序要小很多。是以,對絕大多數順序性較弱的随機數列而言,快速排序總是優于歸并排序。
堆排序(Heapsort)是指利用堆這種資料結構所設計的一種排序算法。堆積是一個近似完全二叉樹的結構,并同時滿足堆積的性質:即子結點的鍵值或索引總是小于(或者大于)它的父節點。堆排序可以說是一種利用堆的概念來排序的選擇排序。分為兩種方法:
大頂堆:每個節點的值都大于或等于其子節點的值,在堆排序算法中用于升序排列;
小頂堆:每個節點的值都小于或等于其子節點的值,在堆排序算法中用于降序排列;
堆排序的平均時間複雜度為 Ο(nlogn)。
将初始待排序關鍵字序列(R1,R2….Rn)建構成大頂堆,此堆為初始的無序區;
将堆頂元素R[1]與最後一個元素R[n]交換,此時得到新的無序區(R1,R2,……Rn-1)和新的有序區(Rn),且滿足R[1,2…n-1]<=R[n];
由于交換後新的堆頂R[1]可能違反堆的性質,是以需要對目前無序區(R1,R2,……Rn-1)調整為新堆,然後再次将R[1]與無序區最後一個元素交換,得到新的無序區(R1,R2….Rn-2)和新的有序區(Rn-1,Rn)。不斷重複此過程直到有序區的元素個數為n-1,則整個排序過程完成。
計數排序(Counting Sort)不是基于比較的排序算法,其核心在于将輸入的資料值轉化為鍵存儲在額外開辟的數組空間中。作為一種線性時間複雜度的排序,計數排序要求輸入的資料必須是有确定範圍的整數。
當輸入的元素是 n 個 0 到 k 之間的整數時,它的運作時間是 Θ(n + k)。計數排序不是比較排序,排序的速度快于任何比較排序算法。
由于用來計數的數組C的長度取決于待排序數組中資料的範圍(等于待排序數組的最大值與最小值的差加上1),這使得計數排序對于資料範圍很大的數組,需要大量時間和記憶體。例如:計數排序是用來排序0到100之間的數字的最好的算法,但是它不适合按字母順序排序人名。但是,計數排序可以用在基數排序中的算法來排序資料範圍很大的數組。
通俗地了解,例如有 10 個年齡不同的人,統計出有 8 個人的年齡比 A 小,那 A 的年齡就排在第 9 位,用這個方法可以得到其他每個人的位置,也就排好了序。當然,年齡有重複時需要特殊處理(保證穩定性),這就是為什麼最後要反向填充目标數組,以及将每個數字的統計減去 1 的原因。
找出待排序的數組中最大和最小的元素
統計數組中每個值為i的元素出現的次數,存入數組C的第i項
對所有的計數累加(從C中的第一個元素開始,每一項和前一項相加)
反向填充目标數組:将每個元素i放在新數組的第C(i)項,每放一個元素就将C(i)減去1
桶排序(Bucket Sort)是計數排序的更新版。它利用了函數的映射關系,高效與否的關鍵就在于這個映射函數的确定。
設定一個定量的數組當作空桶;
周遊輸入資料,并且把資料一個一個放到對應的桶裡去;
對每個不是空的桶進行排序;
從不是空的桶裡把排好序的資料拼接起來。
為了使桶排序更加高效,我們需要做到這兩點:
在額外空間充足的情況下,盡量增大桶的數量 使用的映射函數能夠将輸入的 N 個資料均勻的配置設定到 K 個桶中 同時,對于桶中元素的排序,選擇何種比較排序算法對于性能的影響至關重要。
什麼時候最快 當輸入的資料可以均勻的配置設定到每一個桶中。
什麼時候最慢 當輸入的資料被配置設定到了同一個桶中。
基數排序(Radix Sort)是一種非比較型整數排序算法,其原理是将資料按位數切割成不同的數字,然後按每個位數分别比較。
基數排序是按照低位先排序,然後收集;再按照高位排序,然後再收集;依次類推,直到最高位。有時候有些屬性是有優先級順序的,先按低優先級排序,再按高優先級排序。最後的次序就是高優先級高的在前,高優先級相同的低優先級高的在前。
取得數組中的最大數,并取得位數;
arr為原始數組,從最低位開始取每個位組成radix數組;
對radix進行計數排序(利用計數排序适用于小範圍數的特點)。
基數排序 vs 計數排序 vs 桶排序
這三種排序算法都利用了桶的概念,但對桶的使用方法上有明顯差異:
基數排序:根據鍵值的每位數字來配置設定桶;
計數排序:每個桶隻存儲單一鍵值;
桶排序:每個桶存儲一定範圍的數值;
到這裡十大排序算法就學完了,撒花。。。