快速排序算法
快速排序算法的性能取决于 划分的对称性。
快速排序 -- 选择划分基准
<1>随机选择一个元素作为划分基准。
<2>取子序列的第一个元素。
<3>用中位数的中位数方法寻找划分基准。
分治法
分治策略:
<1>分解:将原序列 a[s...t] 分解成两个子序列 a[s...i-1] 和 a[i+1...t]。其中 i = (s+t)/2;
<2>求解子问题:若子序列的长度是0或1,则是有序的,直接返回;否则递归地求解各个子问题。
<3>合并:由于整个子序列存放在数组 a 中,排序过程是就地进行的,合并步骤不需要执行任何操作。
1 //快速排序 -- 分治法 2 #include<stdio.h> 3 void disp(int a[],int n){ 4 int i; 5 for(i=0;i<n;i++) 6 printf("%d ",a[i]); 7 printf("\n"); 8 } 9 int Partition(int a[],int s,int t){ 10 int i = s,j = t; 11 int tmp = a[s]; //选取第一个记录作为基准 12 while(i != j){ 13 while(j > i && a[j] >= tmp) 14 j--; 15 a[i] = a[j]; 16 while(i < j && a[i] <= tmp) 17 i++; 18 a[j] = a[i]; 19 } 20 a[i] = tmp; 21 return i; 22 } 23 void QuickSort(int a[],int s,int t){ 24 int i; 25 if(s<t){ 26 i = Partition(a,s,t); 27 QuickSort(a,s,i-1); 28 QuickSort(a,i+1,t); 29 } 30 } 31 int main(){ 32 int n = 10; 33 int a[] = {2,5,1,7,10,6,9,4,3,8}; 34 printf("排序前:\n"); 35 disp(a,n); 36 QuickSort(a,0,n-1); 37 printf("排序后:\n"); 38 disp(a,n); 39 return 0; 40 }