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

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

posted @ 2021-04-15 19:10  泥烟  阅读(145)  评论(0编辑  收藏  举报