博客推荐:
快速排序简单理解(实现原理以及不稳定性)
# include<vector>
# include <iostream>
//# include<algorithm>
using namespace std;
//快速排序算法写法一:
//array:待排序的数组;left-左哨兵;right-右哨兵
void QuickSort_1(vector<int>& array, int left_number, int right_number)//排序时第一个数字作为基准一直没动,最后第五步才动
{
if (left_number >= right_number)
{
return;
}
int left = left_number;
int right = right_number;
//第一步:令基准数flag等于数组的第一个数
int flag = array[left_number];
while (left!=right)
{
//第二步: 在right>left的限制下,右哨兵往左走,找到第一个小于flag的数停下来
while (array[right]>=flag && right>left)
{
right--;
}
//第三步:在left<right的限制下,左哨兵往右走,找到第一个大于flag的数停下来
while (array[left] <= flag && left < right)
{
left++;
}
//第四步:因为这时,可能left==right;如果left<right,交换左右哨兵的值;否则while循环结束,执行第五步。
if (left<right)
{
swap(array[left], array[right]);
}
//注意:当left==right时,一定有array[left]<=flag满足
//分析:只存在两种情况达到left==right停下来
//(1)right左移过程中找不到更小的数了,这时array[right]==array[left] 且 ( array[left]<flag 或 array[left] == flag)
//(2)left右移过程中找不到更大的数了,这时array[left]==array[right] 且 ( array[right]<flag ),因为left右移之前,right一定找到了比flag小的数
//综上:array[left]<=flag
}
//第五步:基准数归位:如果left>left_number 且 array[left]<flag, 交换array[left_number]和array[left]
if (left>left_number && array[left]<flag)
{
swap(array[left_number], array[left]);//array[left_number]就是基准数
}
//第六步:递归调用
QuickSort_1(array, left_number, left - 1);
QuickSort_1(array, right + 1, right_number);
}
//快速排序算法写法二:
//array:待排序的数组;left-左哨兵;right-右哨兵
void QuickSort_2(vector<int>& array, int left_number, int right_number)
{
if (left_number>=right_number)
{
return;
}
int left = left_number;
int right = right_number;
//第一步:令基准数flag等于数组的第一个数
int flag = array[left_number];
while (left<right)
{
//第二步: 在left<right的限制下,右哨兵往左走,找到第一个小于flag的数停下来, 交换array[left], array[right]
while (array[right]>=flag && left<right)
{
right--;
}
if (left==right)
break;
else
swap(array[right], array[left]);
//第三步:在left<right的限制下,左哨兵往右走,找到第一个大于flag的数停下来,交换array[left], array[right]
while (array[left] <= flag && left < right)
{
left++;
}
if (left == right)
break;
else
swap(array[left], array[right]);
}
//第四步:递归调用
QuickSort_2(array, left_number, left-1);
QuickSort_2(array, right + 1, right_number);
}
int main()
{
vector <int> array1 = { 1,3,5,2,7,9,0 };
vector <int> array2 = { 1,3,5,2,7,9,0 };
QuickSort_1(array1, 0, array1.size() - 1);
QuickSort_2(array2, 0, array2.size()-1);
return 0;
}