摘要
简单了解并且简单实现了一个快速排序(空间复杂度O(N2),最差时间复杂度O(N2),平均时间复杂度O(Nlog2).
过程
首先取出数组中的一个数为基准(通常可以是数组的最左或右段),再用2个分别指向左右两端的游标,比较基准与游标所指向的数组中的数的大小。
以升序排序为例子,先让右边游标比较,若大于则向左移动,直到找到小于基准的数或者撞死左游标为止。然后左游标移动同理。然后让2个游标所指向的数互换位置。按照这样的逻辑,直到右边的游标碰上左边的,最后将左游标值与基准值互换。完成第一次排序。
再将在游标碰上的点的左右两侧数组分为2部分再进行上述排序,直到仅有1个元素为止(利用递归实现)。
细节
为何右游标先动?
以升序排序为例,若左游标先动,会在右游标处停下,然后左游标与基准值互换,会将一个完全大于左侧的值互换给左左端,导致左侧无法再进行排序。
具体实现(升序快速排序)
#include <iostream>
using namespace std;
void QuickSort(int left,int right,int a[]);
int main()
{
int n;
cin>>n;
int a[n];
for(int i=0;i<n;i++)
{
cin>>a[i];
}
QuickSort(0,n-1,a);
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
void QuickSort(int left,int right,int a[])
{
if(left>=right)
return;
int i,j,base;
i=left;
j=right;
base = a[left];
//cout<<"base = "<<base<<"\n";
while(i<j)
{
while(a[j]>=base && i<j )
{
j--;
//cout<<"a[i]="<<a[i]<<"\n";
}
while(a[i]<=base&&i<j)
{
i++;
}
if(i<j)
{
int temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
a[left] = a[i];
a[i] = base;
QuickSort(left,i-1,a);
QuickSort(i+1,right,a);
}