zoukankan      html  css  js  c++  java
  • [回忆向]快速排序(降序) 感悟

    好久没看排序了,今天仅凭回忆理解联系一下快排,温故而知新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相遇后再与基数互换,那么一个比基数小的数被换到了最左边,这违背了我们要降序排列的初衷

    天涯犹在,不诉薄凉。
  • 相关阅读:
    等你在清华
    印度教导的灵性四句话
    印度“人棍”男孩,用头部自理生活,坚挺过着生活
    观看纯净版优酷视频
    自定义联通话费充值
    windows实用工具
    计算机书籍下载
    文档下载冰点文库
    python读文件的三个方法read()、readline()、readlines()详解
    POJ 3661 Running(dp背包)
  • 原文地址:https://www.cnblogs.com/Knight02/p/14664039.html
Copyright © 2011-2022 走看看