1. 程式人生 > >資料結構之內部排序--排序的基本概念

資料結構之內部排序--排序的基本概念

排序

有n個記錄的序列${R_1,R_2,...,R_n}$,其相應的關鍵字的序列是${K_1,K_2,...,K_n}$,相應的下標序列1,2,...,n。通過排序,找出當前的下標序列1,2,...,n的一種排列$p_1,p_2,...,p_n$,使得相應的關鍵字滿足如下的非遞減(或者非遞增)關係:$K_{p1} <= K_{p2} <= ... <=K_{pn}$,這樣就得到一個按關鍵字樂有序的記錄序列。

內部排序與外部排序

根據排序時資料所佔用的儲存器的不同,可以將排序分為兩大類。一類是整個排序過程完全在記憶體中進行,稱為內部排序;另一類是由於待排序記錄資料量太大,記憶體無法容納全部資料,排序需要藉助外部儲存裝置才能完成,稱為外部排序

主關鍵字與次關鍵字

上面所說的關鍵字$K_i$可以是記錄$R_i$的主關鍵字,也可以是此關鍵字,甚至可以時記錄中若干資料項的組合。若$K_i$是主關鍵字,則任何一個無序的序列經排序後得到的有序序列是唯一3的;若$K_i$是次關鍵字或是記錄中若干資料項的組合,得到的排序結果可能是不唯一的。

排序的穩定性

若在排序前的的佇列中$R_i$領先於$R_j$其中$i<j$,經過排序後得到的序列中$R_i$仍然領先於$R_j$,則稱排序方法是穩定的。反之領先關係在排序時發生變化,則稱排序方法是不穩定的
無論是穩定的還是不穩定的演算法,都可以很好的排序,只不過在某些時候我們需要讓他的順序保持不變。

常用排序的基本型別

1.插入類排序

-直接插入排序
-折半插入排序
-希爾排序
排序演算法 穩定性 時間複雜度 最好情況 最壞情況 空間複雜度
直接插入 穩定 $O(n^2)$ $O(n)$ $O(n^2)$ $O(1)$
折半插入 穩定 $O(n^2)$ $O(nlogn)$ $O(n^2)$ $O(1)$
希爾排序 不穩定 $O(n^{1.5})$ $O(1)$

2.交換類排序

-氣泡排序
-快速排序
排序演算法 穩定性 時間複雜度 最好情況 最壞情況 空間複雜度
氣泡排序 穩定 $O(n^2)$ $O(n)$ $O(n^2)$ $O(1)$
快速排序 不穩定 $O(nlog_{2^n})$ $O(nlog_{2^n})$ $O(n^2)$ $O(log_{2^n})$

3.選擇類排序

-簡單選擇排序
-樹形選擇排序
-堆排序
排序演算法 穩定性 時間複雜度 最好情況 最壞情況 空間複雜度
簡單選擇排序 不穩定 $O(n^2)$ $O(n^2)$ $O(n^2)$ $O(1)$
樹形選擇排序 穩定 $O(nlog_{2^n})$ $O(nlog_{2^n})$ $O(nlog_{2^n})$ $O(n)$
堆排序 不穩定 $O(nlog_{2^n})$ $O(nlog_{2^n})$ $O(nlog_{2^n})$ $O(1)$

4.歸併排序

-歸併排序
排序演算法 穩定性 時間複雜度 最好情況 最壞情況 空間複雜度
歸併排序 穩定 $O(nlog_{2^n})$ $O(nlog_{2^n})$ $O(n)$

5.分配類排序

-多關鍵字排序
-鏈式基數排序

總結

資料結構在計算機世界裡承擔很重要的角色。就例如十萬個數排序快速排序的時間在0.5s左右(Python編寫),而有的排序則需要十幾分鍾,可想而知,在現在大資料時代,沒有一個好的資料結構,沒有一個好的演算法,對生產來說,十分不利。其次資料結構也大大的提升了自己的邏輯判斷水平。對提升自己的編碼水平,有很大的幫助,對自己以後研究演算法,也會打下堅實的基礎。或許這些演算法以後用不到,但是我知道,其他複雜的演算法都是在基礎的演算法之上建立的,也應當對這些基礎演算法進行了解。
此篇文章參考
【1】耿國華,張德同,周全名等.資料結構用c語言描述【M】.第二版.北京:高等教育出版社.2016.

有什麼問題請聯絡我

QQ:3116316431 (請附上資訊)
E-mail:[email protected]