排序算法-C++实现
一、快速排序
1.1 双指针实现
#include<iostream>
#include<vector>
#include<utility>
using namespace std;
int split(vector<int>& a,int left,int right) {
int provit = a[left];
int index = left;
while(left < right) {
while(left < right && a[right] >= provit) {
right --; // this will find the small one from the right
}
while(left < right && a[left] <= provit) {
left ++; // this will find the large one from the left
}
if(left != right) {
swap(a[left],a[right]); // swap the small and large
}
}
swap(a[index],a[left]); // swap provit to the correct position
return left;
}
void quickSort(vector<int>& a,int left,int right) {
if(left < right) {
int index = split(a,left,right);
quickSort(a,left,index-1);
quickSort(a,index+1,right);
}
}
int main() {
vector<int> a = {5,7,9,1,6,5};
quickSort(a,0,a.size()-1);
for(int i = 0; i < a.size();i++) {
cout << a[i] << " ";
}
cout << endl;
return 0;
}
1.2 for循环实现
#include<iostream>
#include<vector>
#include<utility>
using namespace std;
int partition(vector<int>& array,int left,int right) {
int provit = array[left];
int index = left;
swap(array[left],array[right]);
for(int i = left;i < right;i++) {
if(array[i] <= provit) {
swap(array[index++],array[i]);
}
}
swap(array[index],array[right]);
return index;
}
void quickSort(vector<int>& array,int left,int right) {
if(left < right) {
int i = partition(array,left,right);
quickSort(array, left, i-1);
quickSort(array, i+1, right);
}
}
int main(){
vector<int> array = {5,8,7,6,5,9};
quickSort(array,0,array.size()-1);
for(int i=0;i<array.size();i++) {
cout << array[i] << " ";
}
cout << endl;
return 0;
}
复杂度分析
时间复杂度
快速排序的时间复杂度是O(nlogn), 详细分析见快速排序算法的时间复杂度分析[详解Master method]以及快速排序 及其时间复杂度和空间复杂度
空间复杂度
首先就地快速排序使用的空间是O(1)的,也就是个常数级;而真正消耗空间的就是递归调用了,因为每次递归就要保持一些数据;
最优的情况下空间复杂度为:O(logn);每一次都平分数组
最差的情况下空间复杂度为:O(n);退化为冒泡排序