快速排序算法

快速排序算法的性能取决于 划分的对称性

快速排序 -- 选择划分基准

<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 } 
View Code
posted @ 2020-01-04 17:46  Hqx_curiosity  阅读(319)  评论(0编辑  收藏  举报