@Author: 张海拔
@Update: 2014-01-11
@Link: http://www.cnblogs.com/zhanghaiba/p/3515078.html
1 /* 2 *Author: ZhangHaiba 3 *Date: 2014-1-11 4 *File: quick_sort.c 5 * 6 *a quick sort demo 7 */ 8 9 #include <stdio.h> 10 #define N 512 11 12 void quick_sort(int*, int, int); 13 void set_array(int*, int); 14 void show_array(int*, int); 15 16 int array[N]; 17 18 int main(void) 19 { 20 int n; 21 22 scanf("%d", &n); 23 set_array(array, n); 24 quick_sort(array, 0, n-1); 25 show_array(array, n); 26 return 0; 27 } 28 29 void quick_sort(int *a, int l, int r) 30 { 31 int i = l, j = r, p = a[l]; 32 33 if (i >= j) 34 return; 35 while (i < j) { 36 while (i < j && a[j] >= p) 37 --j; 38 if (i < j) 39 a[i++] = a[j]; 40 while (i < j && a[i] <= p) 41 ++i; 42 if (i < j) 43 a[j--] = a[i]; 44 } 45 a[i] = p; 46 quick_sort(a, l, i-1); 47 quick_sort(a, i+1, r); 48 } 49 50 51 void set_array(int *a, int n) 52 { 53 int i; 54 55 for (i = 0; i < n; ++i) 56 scanf("%d", a+i); 57 } 58 59 void show_array(int *a, int n) 60 { 61 int i; 62 63 for (i = 0; i < n; ++i) 64 printf(i == n-1 ? "%d\n" : "%d ", a[i]); 65 }
快速排序属于交换排序方法,可以说是对冒泡排序的改进。
首先你必须知道分治法,通过“冒泡”(划分函数或代码),使得枢纽元素p的左边元素都小于等于它,右边元素都大于等于它。此时枢纽元素的最终位置已经完全确定了。
此时左边部分的数组和右边部分部分的数组都是一个规模变小的原问题。因此非常方便用递归处理。
如果此时你能联系到二叉树的遍历,思路就会非常明朗,因为快排过程就可以画一棵树来表示,树没有扩展时是一个数组,扩展后则根是已经确定位置的树根。
整个过程就是二叉树的前序遍历,在访问当前根之前就进行数组划分(即树的扩展)。
当你画出了快速排序的二叉树,不难分析出效率。
假定树的严格平衡的,那么每一层的划分遍历效率都是O(n),而二叉树的高度是logn,所以快速排序的最好效率是O(n*logn)。
至于划分函数,有很多的实现方法。比较简单的实现就是大量通过swap()函数,毕竟快速排序本身就是交换排序方法。
这里的划分函数嵌入到快速排序中,并去掉了swap()函数,效率是比较高的。