• [回忆向]快速排序(降序) 感悟


    好久没看排序了,今天仅凭回忆理解联系一下快排,温故而知新O(∩_∩)O

     1 #include<iostream>
     2 #define Maxn 100000
     3 #define swap(a,b) {int t=a; a=b; b=t;}
     4 using namespace std;
     5 
     6 int num[Maxn]={0};
     7 void quickSort(int left, int right)
     8 {
     9     if(left>=right)return;
    10     
    11     int m,n,temp;//temp为基准数 
    12     m=left;
    13     n=right;
    14     temp=num[m];
    15     
    16     while(m!=n)
    17     {
    18         while(num[n]<=temp&&m<n)//直到找到大于基准数的 
    19         {
    20             n--;
    21         }
    22         while(num[m]>=temp&&m<n)//直到找到小于基准数的 
    23         {
    24             m++;
    25         }
    26         if(m<n){
    27             swap(num[m],num[n]);
    28         }    
    29     } 
    30     swap(num[left],num[m]);//与基准数交换 
    31     quickSort(left,m-1);
    32     quickSort(m+1,right);
    33     return ;
    34 }
    35 int main()
    36 {
    37     int sum;
    38     cin>>sum;
    39     for(int i=1; i<=sum; ++i)
    40     {
    41         cin>>num[i];
    42     }
    43     quickSort(1,sum);
    44     for(int i=1; i<=sum; ++i)
    45     {
    46         cout<<num[i]<<' ';
    47     }
    48     return 0;
    49 }

    为什么右端的n先动呢?

    一番思索后我觉得这样阐述较为易懂:

    若我们先从左边的m开始时,那么 在该程序中(即降序排列,且基数设置为了最左边的数)m所停留的那个位置肯定是小于基数的,(毕竟在m,n向彼此靠拢的时候,需要分别将比基数小的,比基数大的互换,形成大数->小数的趋势),此时主动权在m手上,m与n相遇后再与基数互换,那么一个比基数小的数被换到了最左边,这违背了我们要降序排列的初衷

    天涯犹在,不诉薄凉。
  • 相关阅读:
    Python入门 日志打印
    Python入门 面向对象
    Python入门 更换pip源的方法
    Python入门 模块
    Python入门 函数式编程
    四月份该做的事情
    Docker入门 配置篇
    Python入门 序列章
    Python入门 值内存管理与所有的关键字
    论操作系统的IO
  • 原文地址:https://www.cnblogs.com/Knight02/p/14664039.html
Copyright © 2020-2023  润新知