splash365

quick_sort [median of three]

Jan 16th, 2021 (edited)
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.73 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define     rep(i,k,n)      for(int i=k;i<n;i++)
  5. #define     fast            ios_base::sync_with_stdio(false);cin.tie(NULL)
  6. #define     read            freopen("input.txt","r",stdin)
  7. #define     write           freopen("output.txt","w",stdout)
  8. #define     D(x)            cout << '>' << #x << ':' << x << endl
  9. #define     DD(x,y)         cout << '>' << #x << ':' << x << ' ' << #y << ':' << y << endl
  10. #define     DDD(x,y,z)      cout << '>' << #x << ':' << x << ' ' << #y << ':' << y << ' ' << #z << ':' << z << endl
  11. #define     PI              acos(-1)
  12. #define     MP(x, y)        make_pair(x, y)
  13. #define     PB(x)           push_back(x)
  14. #define     ALL(p)          p.begin(),p.end()
  15. #define     CLR(p)          memset(p, 0, sizeof(p))
  16. #define     MEM(a, b)       memset(a, (b), sizeof(a))
  17. #define     ff              first
  18. #define     ss              second
  19. #define     sf              scanf
  20. #define     pf              printf
  21. #define     PII             pair<int, int>
  22. #define     ll              long long int
  23. #define     ull             unsigned long long int
  24.  
  25. inline int two(int n) { return 1 << n; }
  26. inline int test(int n, int b) { return (n>>b)&1; }
  27. inline void set_bit(int & n, int b) { n |= two(b); }
  28. inline void unset_bit(int & n, int b) { n &= ~two(b); }
  29. inline int last_bit(int n) { return n & (-n); }
  30. inline int ones(int n) { int res = 0; while(n && ++res) n-=n&(-n); return res; }
  31.  
  32. template < class T > inline T gcd(T a, T b) {while(b) { a %= b; swap(a, b); } return a;}
  33. template < class T > inline T bigmod(T p, T e, T M){
  34.     ll ret = 1;
  35.     for(; e > 0; e >>= 1){ if(e & 1) ret = (ret * p) % M; p = (p * p) % M; }
  36.     return (T)ret;
  37. }
  38. template < class T > inline T power(T a, T n) {
  39.     if(n==0) return 1;
  40.     if(n==1) return a;
  41.     T R = power(a,n/2);
  42.     return (n%2==0) ? R*R : R*a*R;
  43. }
  44.  
  45. int fx4[] = {0, 0, -1, +1};
  46. int fy4[] = {+1, -1, 0, 0};
  47. int fx8[] = {1, 1, 0, -1, -1, -1, 0, 1, 0};
  48. int fy8[] = {0, 1, 1, 1, 0, -1, -1, -1, 0};
  49. int fx8Knight[] = {+2, +2, +1, -1, -2, -2, -1, +1};
  50. int fy8Knight[] = {+1, -1, -2, -2, -1, +1, +2, +2};
  51.  
  52. int cnt = 0;
  53.  
  54. int median(int *a, int low, int high)
  55. {
  56.     int midIndex = low + (high - low) / 2;
  57.     int leftVal = a[low], rightVal = a[high - 1], midVal = a[midIndex];
  58.     int pidx = low;
  59.     int pivot = leftVal;
  60.     if((midVal > pivot && midVal < rightVal) || (midVal > rightVal && midVal < pivot))
  61.     {
  62.         pivot = midVal;
  63.         pidx = midIndex;
  64.     }
  65.     else if((rightVal > pivot && rightVal < midVal) || (rightVal > midVal && rightVal < pivot))
  66.     {
  67.         pivot = rightVal;
  68.         pidx = high - 1;
  69.     }
  70.     return pidx;
  71. }
  72.  
  73. int Partition(int *a, int low, int high)
  74. {
  75.     int pidx = median(a, low, high);
  76.     int pivot = a[pidx];
  77.     int i = low-1;
  78.     int j = high;
  79.     while(i<j)
  80.     {
  81.         do
  82.         {
  83.             i++;
  84.             cnt++;
  85.         } while(a[i]<=pivot && i <= high);
  86.         do
  87.         {
  88.             j--;
  89.             cnt++;
  90.         }while(a[j]>pivot && j >= low);
  91.         if(i<j) swap(a[i],a[j]);
  92.     }
  93.     swap(a[pidx],a[j]);
  94.     return j;
  95. }
  96.  
  97. void QuickSort(int *a, int low, int high)
  98. {
  99.     int pindex;
  100.     if(low < high)
  101.     {
  102.         pindex = Partition(a, low, high);
  103.         DD(pindex,cnt);
  104.         QuickSort(a, low, pindex);
  105.         QuickSort(a, pindex+1, high);
  106.     }
  107. }
  108.  
  109. int main()
  110. {
  111. #ifndef ONLINE_JUDGE
  112.     read;
  113.     write;
  114. #endif
  115.     fast;
  116.     int n;
  117.     while(cin>>n)
  118.     {
  119.         if(n==0) break;
  120.         int arr[n];
  121.         for(int i=0; i<n; i++) cin>>arr[i];
  122.         QuickSort(arr,0,n);
  123.         cout<<arr[0];
  124.         for(int i=1; i<n; i++) cout<<" "<<arr[i];
  125.         cout<<endl;
  126.     }
  127.     return 0;
  128. }
  129.  
  130. /*
  131. input:
  132. 10
  133. 10 20 30 40 50 60 70 80 90 100
  134. 0
  135. */
  136.  
  137.  
Add Comment
Please, Sign In to add comment