时间复杂度:O(nlogn)
空间复杂度:O(1)
稳定性:不稳定
基本原理:以数组的第一个数位标志,将小于标志的数放在数组前面,大小标志的数放在数组后面。操作后将一个数放在了他在排序数组中的位置,然后对前半部分和后半部分分别重复相同操作。
ps,快排对本身基本有序的数组而言效率不高,时间复杂度会接近O(n^2)
代码:
/*
大学课程中各种排序算法的实现
语言:C++
作者:Kylin.C
*/
#include<iostream>
#include<vector>
using namespace std;
//快速排序
int Partion(vector<int> &arr, int beg, int end)
{
if (beg < 0 || end < 0 || beg >= arr.size() || end >= arr.size())
return 0;
int pirvot = arr[beg];
while (beg < end)
{
while (beg<end&&arr[end]>=pirvot)//应该加上等于不然会陷入死循环
--end;
arr[beg] = arr[end];
while (beg < end&&arr[beg] <= pirvot)//此处同上,两处必须要有一处加等于
++beg;
arr[end] = arr[beg];
}
arr[beg] = pirvot;
return beg;
}
void QuickSort(vector<int> &arr, int beg, int end)
{
if (arr.size() == 0)
return;
if (beg < end)
{
int npos = Partion(arr, beg, end);
QuickSort(arr, beg, npos - 1);
QuickSort(arr, npos + 1, end);
}
}
int main()
{
vector<int> arr{ 4, 2, 1, 4, 3, 8, 6, 5, 6 };
QuickSort(arr,0,arr.size()-1);
for (auto a : arr)
cout << a << " ";
cout << endl;
system("pause");
return 0;
}