快速排序基于分治法。
时间复杂度:
最好O(nlogn):平衡划分
最差O(n2):基本有序或者基本逆序
(1)选择第一个元素,作为枢纽元素
#include <iostream>
#include <vector>
using namespace std;
int Partition(vector<int>& vec, int low, int high) {
// 选择第一个元素,作为枢纽元素
// 取出枢纽元素
int pivot = vec[low];
while (low < high) {
// 从后面开始寻找
while (low < high && vec[high] >= pivot) {
high--;
}
vec[low] = vec[high];
while (low < high && vec[low] <= pivot) {
low++;
}
vec[high] = vec[low];
}
// 放入枢纽元素
vec[low] = pivot;
// 返回枢纽元素的下标
return low;
}
void QuickSort(vector<int>& vec, int low, int high) {
if (low < high) {
int pos = Partition(vec, low , high);
QuickSort(vec, low, pos - 1);
QuickSort(vec, pos + 1, high);
}
}
int main(int argc, char* argv[]) {
vector<int> vec = {2, 1, 5, 3, 5, 4};
for (int i = 0; i < vec.size(); ++i) {
cout << vec[i] << " ";
}
cout << endl;
QuickSort(vec, 0, vec.size()-1);
for (int i = 0; i < vec.size(); ++i) {
cout << vec[i] << " ";
}
cout << endl;
return 0;
}
(2)选择最后一个元素,作为枢纽元素
#include <iostream>
#include <vector>
using namespace std;
int Partition(vector<int>& vec, int low, int high) {
// 选择最后一个元素,作为枢纽元素
// 取出枢纽元素
int pivot = vec[high];
while (low < high) {
// 从前面开始寻找
while (low < high && vec[low] <= pivot) {
low++;
}
vec[high] = vec[low];
while (low < high && vec[high] >= pivot) {
high--;
}
vec[low] = vec[high];
}
// 放入枢纽元素
vec[high] = pivot;
// 返回枢纽元素的下标
return low;
}
void QuickSort(vector<int>& vec, int low, int high) {
if (low < high) {
int pos = Partition(vec, low , high);
QuickSort(vec, low, pos - 1);
QuickSort(vec, pos + 1, high);
}
}
int main(int argc, char* argv[]) {
vector<int> vec = {2, 1, 5, 3, 5, 4};
for (int i = 0; i < vec.size(); ++i) {
cout << vec[i] << " ";
}
cout << endl;
QuickSort(vec, 0, vec.size()-1);
for (int i = 0; i < vec.size(); ++i) {
cout << vec[i] << " ";
}
cout << endl;
return 0;
}