快速排序是由東尼·霍爾所發展的一種排序演算法。在平均狀況下,排序
n個元素要
o(nlogn)
次比較。在最壞狀況下則需要
o(n^2)
次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他
o(nlogn)
演算法更快,因為它的內部迴圈可以在大部分的架構上很有效率地被實現出來。
快速排序使用分治策略(divide and conquer)來把乙個序列分為兩個子串行。步驟為:
1. 從序列中挑出乙個元素,作為"基準"(pivot).
2. 把所有比基準值小的元素放在基準前面,所有比基準值大的元素放在基準的後面(相同的數可以到任一邊),這個稱為分割槽(partition)操作。
3. 對每個分割槽遞迴地進行步驟1~2,遞迴的結束條件是序列的大小是0或1,這時整體已經被排好序了。
#include
// 交換函式
void swap (int a, int i, int j)
// 列印陣列
void printa (int *a, int len)
printf ("\n");
}// 分割槽操作,返回基準值的下標
int partition(int *a, int left, int right)
}swap (a, index, right);
return index; // 基準值所在位置下標
}void qsort(int *a, int left, int right)
}int main()
;int len = sizeof(a) / sizeof(a[0]);
qsort (a, 0, len-1);
printa (a, len);
return 0;
}
排序篇之快速排序
快速排序是一種劃分交換排序。它採用了一種分治的策略。1.分治法的基本思想 分治法的基本思想是將原問題分解為若干個規模更小但結構和原問題相似的子問題。遞迴的解決這些子問題,然後將這些子問題的解組合為原問題的解。2.快速排序的基本思想 設待排序的無序區為r low.high 利用分治法可將快速排序的基本...
C語言排序之選擇排序篇
選擇排序也是一種簡單直觀的排序演算法。它的工作原理很容易理解 初始時在序列中找到最小 大 元素,放到序列的起始位置作為已排序序列 然後,再從剩餘未排序元素中繼續尋找最小 大 元素,放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。注意選擇排序與氣泡排序的區別 氣泡排序通過依次交換相鄰兩個順序不...
C語言排序之歸併排序篇
歸併排序是建立在歸併操作上的一種有效的排序演算法,效率為o nlogn 1945 年由馮 諾伊曼首次提出。歸併排序的實現分為遞迴實現與非遞迴 迭代 實現。遞迴實現的歸併排序是演算法設計中分治策略的典型應用,我們將乙個大問題分割成小問題分別解決,然後用所有小問題的答案來解決整個大問題。非遞迴 迭代 實...