快速排序的基本思想是分治思想,每一次选取数组首元素作为pivot,将大于它的数放在右边,小于它的数放在左边。基本思路就是首先从右往左找到小于pivot的元素,然后再从左往右找到大于pivot的元素,这时如果两个元素再原数组中的位置为大的在左边,小的在右边,就对他们进行交换。
#include<iostream>
#include<vector>
using namespace std;
void partition(vector<int>& input, int start, int end) {
int left = start + 1, right = end;
if (left > right) return;
int pivot = input[start];
//3 2 1 4 5
//3 2
while (left <= right) {
while (left <= right && input[right] >= pivot) {
right--;
}
while (left <= right && input[left] <= pivot) {
left++;
}
if (left < right) swap(input[left], input[right]);
//最后停在刚好小于pivot的地方,或者left==right
//1.在第一个循环停止,停在刚好小于left的地方,input[right+1]>=pivot ,所以pivot和right换位置
//2.在第二个循环停止,right停在小于pivot的地方
}
swap(input[start], input[right]);
partition(input, start, right - 1);
partition(input, right + 1, end);
}
int main(){
vector<int>input = { 5,4,3,2,1 };
partition(input, 0, input.size() - 1);
for (int i = 0; i < input.size(); i++) {
cout << input[i] <<" ";
}
return 0;
}
主要是要记住一些边界问题,没事就多写几遍吧。
又写了一遍
#include<iostream>
#include<memory>
#include<vector>
using namespace std;
void quicksort(vector<int>& arr, int start, int end) {
int left = start + 1, right = end;
if (left > right) return;//说明分段中只有一个元素
int pivot = arr[start];
while (left <= right) {
while (left <= right && arr[right] >= pivot) right--;//从右往左寻找小于pivot的元素
while (left <= right && arr[left] <= pivot) left++;
if (left < right) swap(arr[left], arr[right]);
}
//2,1
//最后pivot的位置应该在right,因为无论如何,right停留的位置会小于pivot
//如果在第一个循环出来,说明right=left-1。
swap(arr[start], arr[right]);
quicksort(arr, start, right - 1);
quicksort(arr, right + 1, end);
}
int main(){
vector<int>input = { 1,2,6,5 };
quicksort(input, 0, input.size() - 1);
for (int i = 0; i < input.size(); i++) {
cout << input[i] <<" ";
}
return 0;
}