八大排序算法
快速排序的思想是这样的,如果要对数组区间 [p, r] 的数据进行排序,我们先选择其中任意一个数据作为 pivot(分支点),一般为区间最后一个元素。然后遍历数组,将小于 pivot 的数据放到左边,将大于 pivot 的数据放到右边。接着,我们再递归对左右两边的数据进行排序,直到区间缩小为 1 ,说明所有的数据都排好了序。
![](https://img2018.cnblogs.com/blog/1303039/201903/1303039-20190327100138542-87708449.png)
快速排序的分区过程如下所示,从左到右依次遍历数组,如遇到小于 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 }