思想:分治法
分治法基本思想:将原问题分为若干个规模更小但结构与原结构相似的子问题,递归地解这些子问题,然后将这些子问题的解组合为原问题的解。
代码:
1 #include<stdio.h>
2 void quick_sort(int a[],int low,int high)
3 {
4 int i,j,pivot;
5 if(low < high)
6 {
7 pivot = a[low];
8 i = low;
9 j = high;
10 while(i<j)
11 {
12 while(i<j && a[j]>=pivot)
13 j--;
14 if(i<j)
15 a[i++] = a[j];//将比privot移到低端
16 while(i<j && a[i]<=pivot)
17 i++;
18 if(i<j)
19 a[j--] = a[i];//将比privot移到高端
20 }
21 a[i] = pivot; //pivot移到最终位置
22 quick_sort(a,low,i-1);//对左区间递归排序
23 quick_sort(a,i+1,high);
24 }
25 }
26 void print_array(int a[],int n)
27 {
28 int i;
29 for(i=0;i<n;i++)
30 printf("%d ",a[i]);
31 printf("\n");
32 }
33
34 void main()
35 {
36 int a[]={1,9,5,3};
37 printf("before quick_sort:\n");
38 print_array(a,4);
39 quick_sort(a,0,3);
40 printf("after quick_sort:\n");
41 print_array(a,4);
42 }
说明:这里pivot代表基准值,它的初始值为a[low]。局部变量i和j分别代表low和high的位置,接着按照下面的步骤进行一趟交换:
(1)把比pivot小的元素移动到低端(low)
(2)把比pivot大的元素移动到高端(high)
(3)pivot移动到最终位置,此时pivot左边的值都比它小,右边的值都比它大;
(4)对左右区间分别进行递归排序,把前三步细化,直至最终low和high交汇。
在平均情况下,时间复杂度为O(nlog2n);空间复杂度为O(log2n).