• 快速排序


    思路:

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

    时间复杂度:

      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("
    ");
    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("
    ");*/
    56 
    57     return 0;
    58 }
  • 相关阅读:
    【SICP练习】80 练习2.52
    【SICP练习】79 练习2.51
    【SICP练习】78 练习2.50
    【SICP练习】77 练习2.48-2.49
    【SICP练习】76 练习2.47
    【SICP练习】75 练习2.46
    【SICP练习】74 练习2.45
    【SICP练习】73 练习2.44
    【SICP练习】72 练习2.43
    【SICP练习】71 练习2.42
  • 原文地址:https://www.cnblogs.com/friend-A/p/10060891.html
Copyright © 2020-2023  润新知