以最左边元素为枢轴的快速排序,最好情况时间复杂度为o(nlogn),最坏情况(原始序列已经有序)时间复杂度o(n2),平均情况下的时间复杂度o(nlogn).
#include<iostream>
using namespace std;
void kuaipai(int *a,int l,int r)
{
int i=l,j=r,x=a[l];
if(i<j)
{
while(i<j)
{
while(i<j&&a[j]>x)//从右到左寻找比x小的元素
j--;
if(i<j)
a[i++]=a[j];//找到后将a[j]的值赋给a[i],然后i=i+1;
while(i<j&&a[i]<x)//从左到右寻找比x大的元素
i++;
if(i<j)
a[j--]=a[i];//找到后将a[i]的值赋给a[j],然后j=j-1;
}
a[i]=x;/*当在当组内找完一遍以后就把中间数x回归*/
kuaipai(a,l,i-1);
kuaipai(a,i+1,r);
//最后可能会出现很多左右分支,直到每一组的i = j 为止*
}
}
main()
{
int n;
cin>>n;
int *a=new int [n];
for(int i=0;i<n;i++)
cin>>a[i];
kuaipai(a,0,5);`
for(int i=0;i<n;i++)
cout<<a[i]<<' ';
cout<<endl;
}
随机选择策略的快速排序,时间复杂度与原始序列是否有序无关。
#include<cstdlib>
#include <iostream>
using namespace std;
//用于实现数组成员交换的函数
template <class Type>
void Swap(Type &a,Type &b)
{
Type c;c=a;a=b;b=c;
}
//用于划分左右数组的函数
//p为数组下界,r为上界
template <class Type>
int Partition(Type a[],int p,int r)
{
int i=p,j=r+1;
Type x=a[p];
//将小于x的元素交换到左边区域
//将大于x的元素交换到右边区域
while(true)
{
while((a[++i]<x)&&(i<r));
while(a[--j]>x);
if(i>=j) break;
Swap(a[i],a[j]);
}
a[p]=a[j];
a[j]=x;
return j;
}
//实现随机功能的函数
int Random(int p,int r)
{
return rand()%(r-p+1)+p;
}
//随机划分函数
template <class Type>
int RandomizedPartition(Type a[],int p,int r)
{
//随机的从p至r中抽取一个数
int i=Random(p,r);
//将a[i]和a[p]交换
Swap(a[i],a[p]);
//调用划分函数
return Partition(a,p,r);
}
//随机选择策略的快速排序主功能函数
template <class Type>
void QuickSort(Type a[],int p,int r)
{
//p为数组下界,r为数组上界
if(p<r)
{
//采用随机选择策略进行划分
int q=RandomizedPartition(a,p,r);
//对左半段排序
QuickSort(a,p,q-1);
//对右半段排序
QuickSort(a,q+1,r);
}
else return;}
main()
{
int n;
cout<<"随机选择策略的快速排序 "<<endl<<"请输入要排序的数组大小:";
cin>>n;
int *a=new int[n];
cout<<"输入要排序的数:"<<endl;
for(int i=0;i<n;i++)
cin>>a[i]; //输入待排序数组
QuickSort(a,0,n-1);
cout<<"输出排好的数:"<<endl; //输出排好序的数组
for(int i=0;i<n;i++)
cout<<a[i]<<' ';
cout<<endl;
}