快速排序 QuickSort C語言版

2021-08-24 22:31:19 字數 2047 閱讀 6390

快速排序的核心在於分治.

分治演算法:

1. 認定只有乙個元素或沒有元素的陣列是有序的.

2. 將陣列按照乙個分界值分為左右兩部分. 左面所有元素值比分界值小, 右面所有元素值比分界值大或等於.

3. 將左右兩部分分別再分治, 直到要分支的部分只有乙個元素或沒有元素, 那麼整個陣列就是有序的了.

部落格:

#include #include #include #define length 500000 /* * 列印乙個指定的陣列 */ void printarray(int array, int length); /* * 將指定陣列的指定部分分治, 返回分治點. * @argument division: 分界點(下標) * @argument left: 分治部分的左下標 * @argument right: 分治部分的右下標 */ int part(int array, int division, int left, int right); /* * 排序指定陣列的指定位置元素. */ void sort(int array, int left, int right); /* * @author: selfimpr * @blog: * @email: [email protected] */ int main() /* * printarray(array, length); * printf("/n/n"); */ clock_t start = clock(); printf("start at %d./n", (unsigned)start); sort(array, 0, length - 1); clock_t end = clock(); printf("end at %d./n", (unsigned)end); /* * printarray(array, length); */ printf("sorted %d numbers in %d millisecond.", length, (unsigned)end - (unsigned)start); return 0; } void printarray(int array, int length) } } /* * 分治演算法: * 以division下標的元素值為分界點, 將陣列分成左右兩個部分. * 返回分界點的下標. * 過程: * 1. 保留分界點元素的值. * 2. 移動左指標, 直到乙個值不小於分界值. * 3. 判斷是否已經劃分了所有元素, 如果是, 跳出. * 4. 將左指標目前的值複製到division位置, 重置division為left位置. * 5. 和2-4步驟一樣, 處理右指標. * 6. 將分界值放入最終確定的分界下標. * 7. 返回分界下標. */ int part(int array, int division, int left, int right) if(left >= right) break; array[division] = array[left]; division = left; while(array[right] >= tmp) if(left >= right) break; array[division] = array[right]; division = right; } array[division] = tmp; return division; } /* * 過程: * 1. 將整個left到right位置分治(分治之後左子陣列, 分界值, 右子陣列是有序的.) * 2. 將分治得到的左子陣列和右子陣列分別分治. * 3. 如果傳入的left >= right, 說明要排序的部分元素少於或等於1個, * 那麼必然是有序的,所以直接返回. */ void sort(int array, int left, int right) int division = (left + right) / 2; /* * printf("division: %d, ", array[division]); */ int partition = part(array, division, left, right); /* * printf("partition: %d, left: %d, right: %d, ", partition, left, right); * printarray(array, length); */ sort(array, left, partition - 1); sort(array, partition + 1, right); }

快速排序 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...