快速排序演算法是最早由圖靈獎獲得者tony hoare設計出來的,他在形式化方法理論的發明中都有卓越的貢獻,是上世紀最偉大的計算機科學家之一。而這個快速排序演算法只是他眾多貢獻中的乙個小發明而已。更值得一提的是,我們現在學習的這個快速排序演算法,被列為20世紀十大演算法之一。
快速排序其實就是我們前面認為最慢的氣泡排序的公升級,它們都屬於交換類排序。即它是通過不斷比較和移動交換來實現
排序的,只不過它的實現,增大了記錄的比較和移動的距離,將關鍵字較大的記錄從前面直接移動到後面,關鍵字較小的從後面移動到前面
,從而減少了總的比較次數和移動交換次數。
其基本思想是:
1.選擇乙個基準值,我們設最右邊的乙個作為基準值;
2.遍歷整個區間,把所有的數與基準值作比較並進行資料移動,使得:
1).比基準值小的數放在基準值的左邊;
2).比基準值大的數放在基準值的右邊;
3.分治演算法:[left, right] —> [left, div-1] ∪ [div+1, right],並利用遞迴的思路,遞迴的終止條件為size = 0 或 size = 1 (區間裡沒有數或者區間裡已經有序)。
實現**如下:
#include
#include
void
swap
(int
* a,
int* b)
intpartition
(int
* arr,
int left,
int right)
while
(begin < end && arr[end]
>= arr[right]
)swap
(arr + begin, arr + end);}
swap
(arr + begin, arr + right)
;return begin;
}void
_quicksort
(int
* arr,
int left,
int right)
if(left > right)
int div =
partition
(arr, left, right)
;_quicksort
(arr, left, div -1)
;_quicksort
(arr, div +
1, right);}
void
quicksort
(int
* arr,
int size)
void
print
(int
* arr,
int size)
printf
("\n");
}int
main()
;int size =
sizeof
(arr)
/sizeof
(arr[0]
);printf
("----------測試快速排序----------\n");
printf
("排序之前為: ");
print
(arr, size)
;quicksort
(arr, size)
;printf
("排序之後為: ");
print
(arr, size)
;system
("pause");
return0;
}
執行結果:
快速排序 quick sort C
快速排序效能好壞主要在於主元的選取。下面 有兩種選主元的方式 1 每次選取當前序列的第乙個元素 2 選取選取當前序列的 首元素 中間元素 尾元素 的 中位數.核心 每次 給主元找到準確的排序位置 效率高的原因也就在於每次找的的都是準確的位置 1 選取首元素為基準 主元 的實現 includeint ...
2 快速排序(QuickSort C 實現
快速排序的雖然比較簡單,但對於比較久沒接觸的朋友來說,還是容易遺忘的,本人覺得這裡有兩個難點 1 快速排序中心思想 快速排序的思想歸納起來有的三步 任意選取序列中的乙個元素,用此元素作為 中間元素 這裡說明一下,這個 中間元素 排序後不一定剛好在序列的中間。在序列中取出所有大於 中間元素 的元素,放...
快速排序(QuickSort) C語言版
include include define maxsize 20 順序表的最大長度 typedef int keytype 定義關鍵字型別為整數型別 typedef struct redtype 記錄型別 typedef struct sqlist 順序表型別 quicksort int part...