參考博文鏈接: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];
}