八大排序算法

快速排序的思想是这样的,如果要对数组区间 [p, r] 的数据进行排序,我们先选择其中任意一个数据作为 pivot(分支点),一般为区间最后一个元素。然后遍历数组,将小于 pivot 的数据放到左边,将大于 pivot 的数据放到右边。接着,我们再递归对左右两边的数据进行排序,直到区间缩小为 1 ,说明所有的数据都排好了序。

 快速排序的分区过程如下所示,从左到右依次遍历数组,如遇到小于 pivot 的元素,则进行数据交换 ,否则继续往前进行,最后再放置 pivot。

 

 代码1:

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 
 5 void Quick_Sort(vector<int> &data, int left, int right)
 6 {
 7     if (left < right)
 8     {
 9         int i = left, j = left;
10         int pivot = data[right];
11 
12         for (j = left; j < right; j++)
13         {
14             if (data[j] < pivot)
15             {
16                 swap(data[i], data[j]);
17                     i++;
18             }
19         }
20         data[j] = data[i];
21         data[i] = pivot;
22         Quick_Sort(data, left, i - 1);
23         Quick_Sort(data, i + 1, right);
24     }
25 }
26 
27 int main()
28 {
29     vector<int> vec;
30     int n;
31     cin >> n;
32     for (int i = 0; i < n; i++)
33     {
34         int a;
35         cin >> a;
36         vec.push_back(a);
37     }
38     cout << "排序前:";
39     for (auto c : vec)
40         cout << c << " ";
41     cout << endl;
42     Quick_Sort(vec, 0, vec.size() - 1);
43     cout << "排序后:";
44     for (auto c: vec)
45         cout << c << " ";
46     system("pause");
47     return 0;
48 }

 方法2:

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 
 5 void Quick_Sort(vector<int> &data, int left, int right)
 6 {
 7     if (left < right)
 8     {
 9         int i = left, j = right;
10         int pivot = data[j];
11         while (i < j)
12         {
13             while (i < j && data[i] <= pivot) // 从左往右找到第一个比 pivot 大的数
14             {
15                 i++;
16             }
17             if (i < j)
18             {
19                 data[j--] = data[i];
20             }
21             while (i < j && data[j] >= pivot) // 从右往左找到第一个比 pivot 小的数
22             {
23                 j--;
24             }
25             if (i < j)
26             {
27                 data[i++] = data[j];
28             }
29         }
30         data[i] = pivot; // i=j
31         Quick_Sort(data, left, i - 1);
32         Quick_Sort(data, i + 1, right);
33     }
34 }
35 
36 int main()
37 {
38     vector<int> vec;
39     int n;
40     cin >> n;
41     for (int i = 0; i < n; i++)
42     {
43         int a;
44         cin >> a;
45         vec.push_back(a);
46     }
47     cout << "排序前:";
48     for (auto c : vec)
49         cout << c << " ";
50     cout << endl;
51     Quick_Sort(vec, 0, vec.size() - 1);
52     cout << "排序后:";
53     for (auto c: vec)
54         cout << c << " ";
55     system("pause");
56     return 0;
57 }

参考资料

原文地址:https://www.cnblogs.com/sunbines/p/10605546.html