兩種常用的排序演算法

2021-09-18 08:24:28 字數 2522 閱讀 1465

本文討論兩種著名且很有用的排序演算法:插入排序,快速排序。

插入排序的思想與打牌起牌類似:每次從牌堆裡拿一張牌,插入到已經排好序的牌中。

具體演算法描述如下:

從第乙個元素開始,該元素可以認為已經被排序

取出下乙個元素,從該元素開始,從後向前掃瞄表

如果前乙個元素大於後乙個元素,則交換兩個元素的位置

重複步驟 3,直到前乙個元素不大於後乙個元素

重複步驟 2~4

現有一組陣列 a = [5, 6, 3, 1, 8, 7, 2, 4],共有八個記錄,排序過程如下:

[5]   6   3   1   8   7   2   4

↑ │

└───┘

[5, 6] 3 1 8 7 2 4

↑ │

└────────┘

[3, 5, 6] 1 8 7 2 4

↑ │

└──────────┘

[1, 3, 5, 6] 8 7 2 4

↑ │

└──┘

[1, 3, 5, 6, 8] 7 2 4

↑ │

└────┘

[1, 3, 5, 6, 7, 8] 2 4

↑ │

└────────────────┘

[1, 2, 3, 5, 6, 7, 8] 4

↑ │

└─────────────┘

[1, 2, 3, 4, 5, 6, 7, 8]

動態過程如下:

**實現:

function isort(a, n, i, j, t) 

}}# 測試**

# 每個數字佔一行

end

}

要排序的檔案:

$ cat isort.txt56

3187

24排序後輸出:

$ awk -f isort.awk isort.txt12

3456

78輸入倒序的10個數字:

$ seq 1 10 | tac | awk -f isort.awk12

3456

78910

演算法複雜度分析:

因為有兩層迴圈,所以演算法複雜度為

$$ o(n^2)$$

快速排序是圖靈獎得主 c. r. a. hoare 於1960 年提出的一種劃分交換排序。它採用了一種分治的策略,通常稱其為分治法(divide and conquer)。

分治法的基本思想是:將原問題分解為若干個規模更小但結構與原問題相似的子問題。遞迴地解這些子問題,然後將這些子問題的解組合為原問題的解。

步驟為:

從數列中挑出乙個元素,稱為"基準"(pivot),

重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽結束之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。

遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。

**可以看這裡,講得比較詳細。

**實現:

function swap(a, left, right, t) 

function qsort(a, left, right, pivot, i, j)

}# when i >= j it means the j-th position is the correct position

# of the pivot element, hence swap the pivot element with the

# element in the j-th position

swap(a, pivot, j)

# repeat quicksort for the two sub-arrays, one to the left of j

# and one to the right of j

qsort(a, left, j - 1)

qsort(a, j + 1, right)

}}# 測試**

end

}

和插入排序一樣,測試如下:

$ cat isort.txt56

3187

24$ awk -f qsort.awk isort.txt12

3456

78$ seq 1 10 | tac | awk -f qsort.awk12

3456

78910

演算法複雜度分析:

平均複雜度為 $$ o(nlogn) $$

常用的C語言排序演算法 兩種

1.要求輸入10個整數,從大到小排序輸出 輸入 2 0 3 4 8 9 5 1kjnirrtiv 7 6 輸出 9 8 7 6 5 3 2 1 0 4 解決方法 選擇排序法 實現 如下 include int main int argc,const char ar 用兩個for巢狀迴圈來進行資料大小...

快速排序的兩種演算法

假設我們現在對 6 1 2 7 9 3 4 5 10 8 這個10個數進行排序。先將第乙個數當成基準數,然後以i,j當成哨兵分別指向陣列的首尾,第一次讓j先移動,移動到比基準數小的數字時停下,然後讓i移動至比基準數大的數字停下,交換arr i 和arr j 一直遍歷,知道i和j兩個哨兵相遇停止,然後...

拓撲排序的兩種演算法

1.拓撲排序主要有兩種演算法 方法1 演算法導論 上給出的dfs 時間戳 方法2 求頂點入度 貪心演算法。2.兩種演算法的 分別如下 view code 1 static int f 100 2static int ftime 0 3 遞迴深度優先搜尋 4 template5 void algrap...