参考博文链接:https://blog.csdn.net/qq_28584889/article/details/88136498
当基准数选择最左边的数字时,那么就应该先从右边开始搜索;当基准数选择最右边的数字时,那么就应该先从左边开始搜索。不论是从小到大排序还是从大到小排序!快速排序之所比较快,因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多了。因此总的比较和交换次数就少了,速度自然就提高了。当然在最坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的最差时间复杂度和冒泡排序是一样的都是O(N2),它的平均时间复杂度为O(NlogN)。
#include <iostream>
#include <vector>
using namespace std;
//快速排序(从小到大)
vector<int> quickSort(int left, int right, vector<int>& arr)
{
if(left >= right)
return {0};
int i, j, base, temp;
i = left, j = right;
base = arr[left]; //取最左边的数为基准数
while (i < j)
{
while (arr[j] >= base && i < j)
j--;
while (arr[i] <= base && i < j)
i++;
if(i < j)
{
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
//基准数归位
arr[left] = arr[i];
arr[i] = base;
quickSort(left, i - 1, arr);//递归左边
quickSort(i + 1, right, arr);//递归右边
return arr;
}
//快速排序(从大到小)
vector<int> quickSort_1(int left, int right, vector<int>& arr)
{
if(left >= right) //递归边界条件
return {0};
if(left < 0 || right >= arr.size())
{
cout << "error args! array bound." << endl;
return {-1};
}//非法输入判断,防止数组越界
int i, j, base, temp;
i = left, j = right;
base = arr[left]; //取最左边的数为基准数
while (i < j)
{
while (arr[j] <= base && i < j)
j--;
while (arr[i] >= base && i < j)
i++;
if(i < j)
{
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
//基准数归位
arr[left] = arr[i];
arr[i] = base;
quickSort_1(left, i - 1, arr);//递归左边
quickSort_1(i + 1, right, arr);//递归右边
return arr;
}
int main()
{
vector<int> a,b,c,d;
a = {2,3,1,5,6,7,9,8};
b = {2,3,1,5,6,7,9,8};
c = quickSort(0,7,a);
d = quickSort_1(0,7,b);
std::cout << c[0]<<" "<<d[0];
}