【筆記】內部排序演算法

Time-space發表於2017-11-03

一、排序的基本概念

  排序:把一個無序的元素序列按照元素的關鍵字遞增或遞減排列為有序的序列。
  假設包含n個元素(記錄)的的序列(E1,E2,.,En)

(E_1,E_2,….,E_n)
對應的關鍵字為(k1,k2,,kn)
(k_1,k_2,…,k_n)
,需確定1,2,…,n的一種排列p1,p2,,pn
p_1,p_2,…,p_n
,使關鍵字滿足非遞減(或非遞增)關係kp1kp2kpn
k_{p1} \leq k_{p2}\leq …\leq k_{pn}
,從而使元素構成一個非遞減(或非遞增)的序列(Ep1,Ep2,.,Epn)
(E_{p1},E_{p2},….,E_{pn})
,這個的一種操作被稱為排序
  穩定排序不穩定排序:在待排序的記錄序列中,若存在兩個或兩個以上關鍵字相等的記錄。假設ki=kj(1in,1jn,ij)
k_i=k_j(1\leq i\leq n,1\leq j\leq n,i \neq j)
,且排序前對應的記錄Ei
E_i
(即i<j
i<j
)。在排序之後,如果元素Ei
E_i
仍領先於Ej
E_j
,則稱這種排序採用的方法是穩定的。如果經過排序之後元素Ej
E_j
領先於Ei
E_i
,則稱這種排序方法是不穩定的。
  內排序外排序:由於待排序的記錄數量不同,使得排序過程中涉及的儲存器不同,可將排序方法分為內部排序和外部排序兩類。內部排序也稱內排序,指的是待排序記錄存在在計算機隨機儲存器中進行的排序過程;瓦布排序也稱為外排序,指的是是待排序記錄的資料量很大,一致記憶體不能容納全部記錄,在排序的過程中需要不斷對外存進行訪問的排序過程。
  一個排序演算法的好壞主要可以通過時間複雜度、空間複雜度和穩定性來衡量。無論演算法穩定還是不穩定,都不會影響到排序的最終結果。通常只考慮比較關鍵字的次數和移動記錄的次數。當關鍵字是字串時,比較關鍵字要佔用較多的時間,是影響時間複雜性的主要因素。而當記錄很大時,為了交換記錄的位置,移動記錄成為影響時間複雜性的主要因素。

  在排序過程中需要一下兩種基本操作:

  1. 比較兩個元素相應關鍵字的大小。
  2. 將元素從一個位置移動到另一個位置。

  第一種操作對大多數排序演算法來說是必要的,第二中操作可通過改變記錄的儲存方式避免。
  待排序的記錄序列可由下列3中儲存方式:

  1. 順序儲存:待排序的元素儲存在一組連續的儲存單元中,這類似於線性表的順序儲存,在序列中相鄰的兩個記錄Ei
    E_i
    Ej
    E_j
    ,它們的物理位置也相鄰。在這種儲存方式中,記錄之間的次序關係由其儲存位置決定,則實現排序必須移動記錄。
  2. 鏈式儲存:待排序的元素儲存在一組不連續的儲存單元中,這類似於線性表的鏈式儲存,序列中相鄰的兩個記錄Ei
    E_i
    Ej
    E_j
    ,它們的物理位置不一定相鄰。在這種儲存方式中,不需要移動元素,只需要修改指標即可。
  3. 靜態連結串列:待排序記錄存放在靜態連結串列中,記錄之間的關係由被稱為遊標的指標指示,實現排序不需要移動元素,只需要修改遊標即可。

  為了演算法實現方便, 本文的排序演算法主要採用順序儲存,相應的元素型別描述如下:

#define MaxSize 100
typedef int KeyType;
typedef struct /*資料元素型別定義*/
 {
    KeyType key;/*關鍵字*/
}DataType;
typedef struct /*順序表型別定義*/
 {
    DataType data[MaxSize];
    int length;
}SqList;

二、插入排序

1.直接插入排序

詳情請點選檢視直接插入排序

2.折半插入排序

詳情請點選檢視折半插入排序

3.2-路插入排序

詳情請點選檢視2-路插入排序

4.表插入排序

詳情請點選檢視表插入排序

5.希爾排序

詳情請點選檢視希爾排序

三、交換排序

1.氣泡排序

詳情請點選檢視氣泡排序

2.快速排序

詳情請點選檢視快速排序

四、選擇排序

1.簡單選擇排序

詳情請點選檢視簡單選擇排序

2.樹形選擇排序

詳情請點選檢視樹形選擇排序

3.堆排序

詳情請點選檢視堆排序

五、歸併排序

詳情請點選檢視歸併排序

六、基數排序

詳情請點選檢視基數排序

七、各種內部排序演算法的比較

相關文章