快速排序 归并排序

 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 }

猜你喜欢

转载自www.cnblogs.com/sxq-study/p/12061178.html