快速排序

思路:

  选定一个基准数,每次一轮排序完成后要满足基准数左边的都是比它小的数,右边的都是比它大的数。然后再分别对左表和右表进行同样的操作,直到所有排序完成。其实不难发现,每一轮排序都使得一个数(基准数)放在了它“正确的”位置上。

时间复杂度:

  O(nlogn)至O(n2),平均时间复杂度为O(nlogn)

代码:(这里给出了每一轮排序后的情况,直到最后的排序完成)

 1 #include<stdio.h>
 2 int a[110];
 3 int n;
 4 int Partition(int *a, int low, int high)  //返回每排一次序后基准数的位置
 5 {
 6     int keynum;   //基准数
 7 
 8     a[0] = a[low];
 9 
10     keynum = a[0];
11 
12     while(low < high)
13     {
14         while(low < high && a[high] >= keynum) //从右往左找第一个比keynum小的数
15             high--;
16 
17         a[low] = a[high]; //找到后就将这个数移到前面low指向的位置
18 
19         while(low < high && a[low] <= keynum) //从左往右找第一个比keynum大的数
20             low++;
21 
22         a[high] = a[low]; //找到后就将这个数移到后面high指向的位置
23     }
24 
25     a[low] = a[0];    //基准数归位
26 
27     return low;   //return high也是一样的
28 }
29 
30 void Qsort(int *a, int low, int high)     //递归实现快排
31 {
32     if(low < high)    //low == high时,即子表只剩一个元素
33     {
34         int pivotloc = Partition(a, low, high);
35         for(int i = 1; i <= n; i++)
36             printf("%d ", a[i]);
37         printf("\n");
38 
39         Qsort(a, low, pivotloc - 1); //对左子表实现排序
40         Qsort(a, pivotloc + 1, high); //对右子表实现排序
41     }
42 }
43 
44 int main()
45 {
46     scanf("%d", &n);
47 
48     for(int i = 1; i <= n; i++)
49         scanf("%d", &a[i]);
50 
51     Qsort(a, 1, n);
52 
53     /*for(int i = 1; i <= n; i++)
54       printf("%d ", a[i]);
55     printf("\n");*/
56 
57     return 0;
58 }

 

posted @ 2018-12-03 21:01  Piccolo_Devil  阅读(141)  评论(0编辑  收藏  举报