排序

排序_第1张图片

一.快速排序

 1 int Partiotion(vector<int> &a, int p, int r)
 2 {
 3     int i = p;
 4     int j = r + 1;
 5     int x = a[p];
 6     while (1)
 7     {
 8         while (a[++i] < x&&i < r);
 9         while (a[--j] > x);
10         if (i >= j)
11             break;
12         swap(a[i], a[j]);
13     }
14     a[p] = a[j];
15     a[j] = x;
16     return j;
17 }
18 void QuickSort(vector<int> &a, int p, int r)
19 {
20     if (p < r)
21     {
22         int q = Partiotion(a, p, r);
23         QuickSort(a, p, q - 1);
24         QuickSort(a, q + 1, r);
25     }
26 }

 二、归并排序

大三了。。我居然才写归并排序。。

 1 void MergeSort(vector<int> &a, vector<int> &b, int l, int m, int r)
 2 {
 3     int k = l;
 4     int i = l, j = m + 1;
 5     while (i <= m && j <= r)
 6     {
 7         if (a[i] <= a[j])
 8         {
 9             b[k++] = a[i++];
10         }
11         else
12             b[k++] = a[j++];
13     }
14     if (i > m)
15     {
16         for (int q = j; q <= r; q++)
17             b[k++] = a[q];
18     }
19     else
20         for (int q = i; q <= m; q++)
21             b[k++] = a[q];
22 }
23 void Divide(vector<int> &a, vector<int> &b, int s, int n)
24 {
25     int i = 0;
26     while (i <= n - 2 * s)
27     {
28         MergeSort(a, b, i, i + s - 1, i + 2 * s - 1);
29         i = i + 2 * s;
30     }
31     if (i + s < n)
32         MergeSort(a, b, i, i + s - 1, n - 1);
33     else
34         for (int j = i; j < n; j++)
35             b[j] = a[j];
36 }
37 void MySort(vector<int> &a, int n)
38 {
39     int size = a.size();
40     vector<int> b(size, 0);
41     int s = 1;
42     while (s < n)
43     {
44         Divide(a, b, s, n);
45         s += s;
46         Divide(b, a, s, n);
47         s += s;
48     }
49 }

 

你可能感兴趣的:(排序)