快速排序(c語言實現)
阿新 • • 發佈:2019-01-26
#include <stdio.h> #define T 1 #define F 0 #define MAXSIZE 10 //要排序陣列個數的最大值 typedef struct { int r[MAXSIZE + 1]; //儲存要排序陣列,r[0]用作哨兵或臨時變數 int length; }SqList; void swap(SqList *L, int i, int j) { int temp = L->r[i]; L->r[i] = L->r[j]; L->r[j] = temp; } //交換順序表L中子表的記錄,使樞軸記錄到位,並返回其所在位置 //此時在它之前(後)的記錄均不大(小)於它 int partition(SqList *L, int low, int high) { int pivotkey; pivotkey = L->r[low]; //用子表的第一個記錄作樞軸記錄 while (low < high) //從表的兩端交替向中間掃描 { while (low < high && L->r[high] >= pivotkey) high--; swap(L, low, high); //將樞軸記錄小的記錄交換到低端 while (low < high && L->r[low] <= pivotkey) low++; swap(L, low, high); //將比樞軸記錄大的記錄交換到高階 } return low; //返回樞軸所在位置 } void QSort(SqList *L, int low, int high) { int pivot; if (low < high) { pivot = partition(L, low, high); //將L->r[low..high]一分為二 //算出樞軸值pivot QSort(L, low, pivot-1); //對低子表遞迴排序 QSort(L, pivot+1, high); //對高子表遞迴排序 } } void quickSort(SqList *L) //對順序表L作快速排序 { QSort(L, 1, L->length); } int main() { int i; SqList L; L.length = 10; for (i = 1; i < L.length+1; i++) { L.r[i] = i; } L.r[5] = 100; L.r[7] = 90; for (i = 1; i < L.length+1; i++) { printf("%d ", L.r[i]); } quickSort(&L); printf("\n"); for (i = 1; i < L.length+1; i++) { printf("%d ", L.r[i]); } printf("\n"); return 0; }
執行結果:
陣列表示:
#include <stdio.h> void swap(int a[], int i, int j) { int temp = a[i]; a[i] = a[j]; a[j] = temp; } int partition(int a[], int low, int high) { int pivotkey; pivotkey = a[low];//單純的記錄值 while (low < high)//以pivoekey為交換媒介(樞軸),將大於它的放在後邊,小於它的放在前面 { while (low < high && a[high] >= pivotkey)//條件判斷 low < high high--; swap(a, low, high); while (low < high && a[low] <= pivotkey) low++; swap(a, low, high); } return low;//返回樞軸所在位置 } void QSort(int a[], int low, int high) { int pivot; if (low < high)//是 if { pivot = partition(a, low, high);//將a[]一分為二 QSort(a, low, pivot - 1);//對低子表遞迴排序 QSort(a, pivot + 1, high);//對高子表遞迴排序 } } void quickSort(int a[], int low, int high) { QSort(a, low, high); } int main() { int i; int a[] = {1,2,5,7,9,6,4,2,6,1}; quickSort(a, 0, 9); for (i = 0; i < 10; i++) { printf("%d ", a[i]); } printf("\n"); return 0; }