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