学习目标:
理解和实现快速排序算法
1.快速排序描述
(1)将数组最左边那位作为基准值,需要将这个基准值放在中间位置,在每轮排序后左边的都比基准值小或相等,右边的比基准值大或相等
(2)下一轮需要划分成左右两部分继续排序
2.代码实现
// left和right位需要排序的范围
void run2(vector<int>&arr,int left,int right) {
if (left < right) {
int l = left, r = right;
//先将基准值另外存储
int temp = arr[l];
while (l < r) {
//从右往左找比基准值小就停下来
while (l < r && arr[r] >= temp) {
--r;
}
arr[l] = arr[r];
//从左往右找到比基准值大的就停下来
while (l < r && arr[l] <= temp) {
++l;
}
arr[r] = arr[l];
}
//当l和r相等时候,就是基准值应该在的位置
arr[l] = temp;
//左右两边继续排序
run2(arr, left, l - 1);
run2(arr, l + 1, right);
}
}
void test() {
vector<int>arr{ 9,7,1,3,5,2,6 };
run2(arr, 0, arr.size() - 1);
print(arr);
}
非递归实现
//非递归快速排序实现
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
void run(vector<int>& arr) {
stack<pair<int, int>>s;
s.push({ 0,arr.size() - 1 });
while (!s.empty()) {
auto it = s.top();
s.pop();
int left = it.first;
int right = it.second;
if (left >= right) {
continue;
}
int l = left, r = right;
int temp = arr[left];
while (left < right) {
while (left < right && arr[right] >= temp) {
--right;
}
arr[left] = arr[right];
while (left < right && arr[left] <= temp) {
++left;
}
arr[right] = arr[left];
}
arr[left] = temp;
s.push({ l,left - 1 });
s.push({ left + 1,r });
}
}
int main() {
vector<int>arr{ 9,10,5,2,3,7,4,6,1,8 };
run(arr);
for (auto it : arr) {
cout << it << " ";
}
}