快速排序是对冒泡排序的改进,它的基本思想是通过一趟排序将数据分成两部分,一部分中的数据都比另一部分中的数据小,再对这两部分中的数据再排序,直到整个序列有序,如下图所示。
快排的递归实现:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int n; 5 6 /* 7 * 分割使枢轴记录的左边元素比右边元素小 8 */ 9 int Partition(int *array, int low, int high) 10 { 11 int pivotkey = array[low]; 12 array[0] = array[low]; 13 while (low < high) 14 { 15 while (low < high && array[high] >= pivotkey) 16 { 17 high--; 18 } 19 array[low] = array[high]; 20 while (low < high && array[low] <= pivotkey) 21 { 22 low++; 23 } 24 array[high] = array[low]; 25 } 26 array[low] = array[0]; 27 return low; 28 } 29 30 /* 31 * 快速排序递归实现 32 */ 33 void QuickSort(int *array, int low, int high) 34 { 35 if (low < high) 36 { 37 int pivotloc = Partition(array, low, high); 38 QuickSort(array, low, pivotloc - 1); 39 QuickSort(array, pivotloc + 1, high); 40 } 41 } 42 43 int main() 44 { 45 int i; 46 int *array; 47 printf("请输入数组的大小:"); 48 scanf("%d", &n); 49 array = (int*) malloc(sizeof(int) * (n + 1)); 50 printf("请输入数据(用空格分隔):"); 51 for (i = 1; i <= n; i++) 52 { 53 scanf("%d", &array[i]); 54 } 55 QuickSort(array, 1, n); 56 printf("排序后为:"); 57 for (i = 1; i <= n; i++) 58 { 59 printf("%d ", array[i]); 60 } 61 printf(" "); 62 }
冒泡排序的时间复杂度是O(n^2),快排是O(n*logn)。
快排的非递归实现: