简介
在待排序序列L[1…n]任取一个元素povit作为基准,通过一趟排序将待排序表划分为独立的两个部分L[1…k-1]和[k+1…n],使得L[1…k-1]中的每一个元素小于povit,L[k+1…n]中的每一个元素大于povit,povit放在了其最终的位置L(k)中,这个过程为一趟排序。而后分别递归的对两个子表重复,直到没部分只有一个元素或为空,即所有元素都放在了最终位置。
时间复杂度:
- 最好情况:O(nlog2nnlog_2 nnlog2n)
- 平均情况:O(nlog2nnlog_2 nnlog2n)
- 最坏情况:O(n2)
空间复杂度:
- 平均情况:O(nlog2nnlog_2 nnlog2n)
- 最坏情况:O(n2)
是否稳定:否
代码
#include <iostream>
using namespace std;
//划分函数
int Partition(int a[], int low, int hight)
{
int pivot = a[low]; //基准值
while(low < hight)
{
while(low < hight && a[hight] >= pivot)
hight--;
a[low] = a[hight];
while(low < hight && a[low] <= pivot)
low++;
a[hight] = a[low];
}
a[low] = pivot;
return low;
}
void QuickSort(int a[], int low, int hight)
{
if(low < hight)
{
int pivotpos = Partition(a, low, hight);
QuickSort(a, low, pivotpos-1);
QuickSort(a, pivotpos+1, hight);
}
}
int main()
{
int n;
cin >> n;
int a[255];
for(int i = 0; i < n; i++)
{
cin >> a[i];
}
QuickSort(a, 0, n-1);
for(int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
return 0;
}