1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 5 using namespace std; 6 7 void quicksort(vector<int>& a,int l,int r){ 8 //递归出口 9 if(l >= r)return; 10 //根据左右边界定义两个指针,在i指针左面的 <=target , 在j指针右面的 >= target 11 int i = l - 1, j = r + 1; 12 //target 为在当前的区间【l,r】中任意一个数,一般选l, r, l+r>>2, random 位置的值 13 int target = a[l+r>>1]; 14 //这里实现i指针左面<=target,j指针右面>=target,终止条件是连个指针没有相遇 15 while(i < j){ 16 //只要连个指针遇见不满足条件的数,就停在那个数的位置上,否则继续走 17 do ++i; while(a[i] < target); 18 do --j; while(a[j] > target); 19 //这里实现交换,因为i位置的数一定满足>=target,同理j位置也一样,所以他俩相互交换,使得分别得到自己想要的数 20 if(i < j)swap(a[i],a[j]); 21 } 22 //递归的去排序已经排好的两个区间 23 quicksort(a,l,j); 24 quicksort(a,j+1,r); 25 } 26 27 int main(){ 28 int n; 29 cin >> n; 30 vector<int> a(n,0); 31 for(int i = 0;i < a.size();++i)cin>>a[i]; 32 quicksort(a,0,a.size()-1); 33 for(int i = 0;i < a.size();++i)cout << a[i] << " "; 34 return 0; 35 }
1 #include <iostream> 2 #include <algorithm> 3 #include <vector> 4 5 using namespace std; 6 7 int n; 8 vector<int> arr(1e6+10,0); 9 vector<int> help(1e6+10,0);//辅助数组 10 11 void unionsort(vector<int>& arr,int l,int r){ 12 //递归出口 13 if(l >= r)return; 14 //递归地把左边一半和右边一半分别排好序 15 int mid = l + r >> 1; 16 unionsort(arr,l,mid); 17 unionsort(arr,mid+1,r); 18 //合并已经排好序的两部分 19 int i = l, j = mid + 1, k = 0; 20 while(i <= mid && j <= r){ 21 if(arr[i] <= arr[j]) help[k++] = arr[i++]; 22 else help[k++] = arr[j++]; 23 } 24 //将剩下的部分合并 25 while(i <= mid)help[k++] = arr[i++]; 26 while(j <= r)help[k++] = arr[j++]; 27 //此时辅助数组已经排好序,复制回原数组 28 for(int i = l,j = 0;i <= r;++i,++j)arr[i] = help[j]; 29 } 30 31 int main(){ 32 cin >> n; 33 for(int i = 0;i < n;++i)cin>>arr[i]; 34 unionsort(arr,0,n-1); 35 for(int i = 0;i < n;++i)cout << arr[i] << " "; 36 return 0; 37 }