归并排序 快速排序

 

 1 #include 
 2 #include 
 3 #include 
 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 
 2 #include 
 3 #include 
 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 }

你可能感兴趣的:(归并排序 快速排序)