排序模板

下面的快排不知道在luogu上提交错误,有看出来的请给我提出错误,谢谢。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<cmath>
  6 #include<cstdlib>
  7 #include<ctime>
  8 using namespace std;
  9 
 10 int a[100007];
 11 int b[100];
 12 int ans;
 13 
 14 void bubble_sort(int *a, int l, int r, int n)
 15 {
 16     for (int i = 1; i < n; i++)
 17     {
 18         for (int j = l; j < r; j++)
 19         {
 20             if (a[j] > a[j + 1]) swap(a[j], a[j + 1]);
 21         }
 22     }
 23 }//冒泡排序 
 24 
 25 void merge_sort(int *a, int l, int r)
 26 {
 27     if (l == r) return;
 28     int mid = (l + r) >> 1;
 29     merge_sort(a, l, mid);
 30     merge_sort(a, mid + 1, r);
 31     
 32     int i = l, j = mid + 1;
 33     //b:辅助数组 
 34     for (int k = l; k <= r; k++)
 35     {
 36         if (j > r || (i <= mid && a[i] < a[j]))
 37         {
 38             b[k] = a[i];
 39             i++;
 40             ans += j - (mid + 1);
 41         }
 42         else
 43         {
 44             b[k] = a[j];
 45             j++;
 46         }
 47     }
 48     for (int k = l; k <= r; k++)
 49         a[k] =b[k];
 50 }//归并排序 求逆序对 
 51             
 52 
 53 void quick_sort(int *a, int l, int r)
 54 {
 55     swap(a[l], a[rand()*rand() % (r -l + 1) +l]);
 56     int tmp = a[l];
 57     int l_ = l, r_ = r;
 58     while (l < r)
 59     {
 60         while (l < r) 
 61         {
 62             if (a[r] > tmp) r--; //a[r]落在正确的位置 
 63             else
 64             {
 65                 a[l] = a[r];
 66                 l++;
 67                 break;
 68             }
 69         }
 70         while (l < r) 
 71         {
 72             if (a[l] < tmp) l++; //a[l]落在正确的位置 
 73             else
 74             {
 75                 a[r] = a[l];
 76                 r--;
 77                 break;
 78             }
 79         }
 80     }
 81     a[l] = tmp;
 82     if (l - l_ > 1) quick_sort(a, l_, l - 1);
 83     if (r_ - r > 1) quick_sort(a, r + 1, r_);
 84 }//快排 
 85 
 86 int quick_select(int *a, int l, int r, int k)
 87 {
 88     swap(a[l], a[rand()*rand() % (r -l + 1) +l]);
 89     int tmp = a[l];
 90     int l_ = l, r_ = r;
 91     while (l < r)
 92     {
 93         while (l < r) 
 94         {
 95             if (a[r] > tmp)r-- ; //a[r]落在正确的位置 
 96             else
 97             {
 98                 a[l] = a[r];
 99                 l++;
100                 break;
101             }
102         }
103         while (l < r) 
104         {
105             if (a[l] < tmp) l++; //a[l]落在正确的位置 
106             else
107             {
108                 a[r] = a[l];
109                 r--;
110                 break;
111             }
112         }
113     }
114     a[l] = tmp;
115     if (k == l - l_ + 1) return a[l];
116     if (k < l - l_ + 1) return quick_select(a, l_, l - 1, k);
117     if (k > l - l_ + 1) return quick_select(a, r + 1, r_, k - (l - l_ + 1));
118 }//寻找第K大的数 
119     
120     
121 
122 int main()
123 {
124     
125     int n;
126     cin>>n;
127     srand(time(0));
128     
129     for (int i = 0; i < n; i++)
130         //a[i] = rand();
131         cin >> a[i];
132         
133     //bubble_sort(a, 0, n - 1, n);
134     quick_sort(a, 0, n - 1);
135     //int k = 5;
136     //cout << quick_select(a, 0, n -1, k) << endl;
137     //merge_sort(a, 0, n - 1);
138     for (int i = 0; i < n; i++)
139         cout << a[i] << ' ';
140     //cout << ans << endl;
141     cout << endl;
142     return 0;
143 }

猜你喜欢

转载自www.cnblogs.com/tpgzy/p/8998669.html