C程式設計——快速排序
阿新 • • 發佈:2019-01-01
1、程式檔案
#include <stdio.h> // 快速排序(Quicksort)是對氣泡排序的一種改進 // 通過一趟排序將要排序的資料分割成獨立的兩部分, // 其中一部分的所有資料都比另外一部分的所有資料都要小, // 然後再按此方法對這兩部分資料分別進行快速排序, // 整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。 void mySwap(int *a, int i, int j) { int tmp = a[i]; a[i] = a[j]; a[j] = tmp; } void myPrint(int *a, int len) { int i; for (i = 0; i < len; i++) { printf ("%4d", a[i]); } printf ("\n"); } // 算基準值下標 int partion(int *a, int left, int right) { int pivot = a[right]; // 以最後一個元素作為基準值 while(left < right) { // 本次迴圈結束後,a[left]的值比基準值大 while (a[left] <= pivot && left < right) { left++; } if (left < right) { // 把以left為下標的比基準值更大的元素移到右邊 a[right] = a[left]; right--; } // 因為之前已經對a[left]進行了判斷,所以left < right while (a[right] >= pivot && left < right) { right--; } if (left < right) { // 把以right為下標的比基準值更小的元素移到左邊 a[left] = a[right]; left++; } } // 因為之前的right處的值已被a[left]覆蓋 // 而right處的值被儲存在pivot中 a[left] = pivot; // left是基準值下標 return left; } void quickSort(int *a, int left, int right) { if (left < right) { // 第一次得基準值下標0 int pivotIndex = partion(a, left, right); // 算基準值下標 quickSort(a, left, pivotIndex-1); // 對左半部分做快速排序 quickSort(a, pivotIndex+1, right); // 對右半部分做快速排序 } } int main() { int a[] = {5,8,6,0,9,4,3,2,1,7}; int len = sizeof(a)/sizeof(a[0]); quickSort(a, 0, len-1); myPrint(a, len); return 0; }
2、測試結果
[email protected]:/mnt/hgfs/shared-lj# gcc 快速排序study.c
[email protected]:/mnt/hgfs/shared-lj# ./a.out
0 1 2 3 4 5 6 7 8 9