快速排序是一种原址,不稳定的排序算法,最坏情况下运行时间为O(n^2),如果采用随机化选取主元或实际情况能达到快速排序划分子问题时能使两个子问题的问题规模划分是常数比例的,就能使运行时间保持在O(n * lgn),而划分的好坏只会改变其常数因子。
三向快速排序主要是解决序列存在大量相同元素时,通过快速排序平均还是需要O(n * lgn),而三向快速排序在所有元素全部相同时只需要O(n)
下面给出其实现;
#include <iostream>
#include <vector>
#include <stdio.h>
using namespace std;
//快速排序(选取序列首元素为主元)
int partition_1(vector<int>& vec,const int& lo,const int& hi) {
int i = lo;
int j = hi + 1;
while (true) {
while (vec[lo] > vec[++i]) if (i == hi) break;
while (vec[lo] < vec[--j]) if (j == lo) break;
if (i >= j) break;
std::swap(vec[i], vec[j]);
}
std::swap(vec[j], vec[lo]);
return i;
}
//快速排序(选取序列尾元素为主元)
int partition_2(vector<int>& vec, const int& lo, const int& hi) {
int i = lo - 1;
int j = hi;
while (true) {
while (vec[hi] > vec[++i]) if (i == hi) break;
while (vec[hi] < vec[--j]) if (j == lo) break;
if (i >= j) break;
std::swap(vec[i], vec[j]);
}
std::swap(vec[i], vec[hi]);
return i;
}
void Quick_Sort(vector<int>& vec,const int& lo,const int& hi) {
if (lo >= hi) {
return;
}
int j = partition_2(vec, lo,hi);
Quick_Sort(vec, lo, j - 1);
Quick_Sort(vec, j + 1, hi);
}
void Quick_Sort(vector<int>& vec) {
Quick_Sort(vec, 0, vec.size() - 1);
}
//三向快速排序
void Three_Quick_Sort(vector<int>& vec,const int& lo,const int& hi) {
if (lo >= hi) {
return;
}
int elpos = lo;
int erpos = hi;
int i = lo + 1;
int temp = vec[lo];
while (elpos < erpos && i <= hi) {
if (vec[i] < temp) {
swap(vec[i++], vec[elpos++]);
}else if (vec[i] > temp) {
swap(vec[i], vec[erpos--]);
}else {
++i;
}
}
Three_Quick_Sort(vec, lo, elpos - 1);
Three_Quick_Sort(vec, erpos + 1, hi);
}
void Three_Quick_Sort(vector<int>& vec) {
Three_Quick_Sort(vec, 0, vec.size() - 1);
}
int main(int argc,char** argv) {
//vector<int> vec{ 9,8,1,6,5,4,9 };
//vector<int> vec{ 9,8,7,6,5,4,3,2,1,0 };
vector<int> vec{ 1,6,2,0,8,5,4,3,7,9 };
//Quick_Sort(vec);
Three_Quick_Sort(vec);
for (auto& v : vec) {
cout << v << endl;
}
system("pause");
return 0;
}