快速排序是一个非常有名的排序方法,在实际应用过程当中被选用的概率特别高。
这里的实现利用了递归的方法,快排的思想就是,做一次从第一个值到倒数第二个值的遍历,在每次把序列的最后一个当做参照,然后将小于这个值的数字与前面的值作替换,这里用到一个循环变量i,从0开始计数,也就是说循环完之后,前面的i个数字都比最后的这个参照数字小,然后将第i+1个数字与最后一个数字互换,这样,这个参照的数字就出现在了正确的排序位置上。
举例说明:最开始是[3, 1, 2],从头开始遍历,第一个数字是3,不比2小,所以不动,这时候i=0,然后第二个数字为1,比2小,则2就要与第一个位置的数字交换,就变成了[1, 3, 2],这时候i=1,循环完成了,就交换最后一个值与索引i上的值,就是交换2和3,这个时候,2就出现在了正确的位置上了,就变成了[1, 2, 3],当然如果前面不止一个数字,后面也不止一个数字,那就对前面的数组以及后面的数组递归的进行处理即可。
具体c++代码如下:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int Partition(vector<int>& nums, int p, int r);
void QuickSort(vector<int>& nums, int p, int r);
void Show(const vector<int> nums);
int main()
{
vector<int> x{5, 2, 6, 1, 8, 4, 3};
QuickSort(x, 0, x.size() - 1);
Show(x);
return 0;
}
int Partition(vector<int>& nums, int p, int r)
{
int x = nums[r];
int i = p - 1;
for (int j = p; j < r; j++)
{
if (nums[j] < x && j != i)
{
i++;
swap(nums[i], nums[j]);
}
}
swap(nums[r], nums[i + 1]);
return i + 1;
}
void QuickSort(vector<int>& nums, int p, int r)
{
if (p < r)
{
int q = Partition(nums, p, r);
cout << q << endl;
Show(nums);
QuickSort(nums, p, q-1);
QuickSort(nums, q+1, r);
}
return;
}
void Show(const vector<int> nums)
{
for (auto x : nums)
{
cout << x << ' ';
}
cout << endl;
}
代码最后的输出结果为:1 2 3 4 5 6 8
排序成功。