本文討論兩種著名且很有用的排序演算法:插入排序,快速排序。
插入排序的思想與打牌起牌類似:每次從牌堆裡拿一張牌,插入到已經排好序的牌中。
具體演算法描述如下:
從第乙個元素開始,該元素可以認為已經被排序
取出下乙個元素,從該元素開始,從後向前掃瞄表
如果前乙個元素大於後乙個元素,則交換兩個元素的位置
重複步驟 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...