假设存在一个数组:6 7 5 2 5 8
快速排序开始时left=0,right=5,key=0,a[key]=6,通过PartSort先从右侧找小于a[key],令right指向第一个被找到的小于a[key]的数,然后从左边找到第一个大于a[key],令left指向它,若此时left<right,则使其交换并继续循环,直到left=right,跳出循环将a[key]与left及right所指向的数交换,并返回left,通过Quicksort将数组以left为中点分成两个数组再次进入循环;
#include<iostream>
using namespace std;
int a[100];
int PartSort(int left,int right)
{
int key=left;
while(left<right)
{
while(left<right&&a[right]>=a[key])
right--;
while(left<right&&a[left]<=a[key])
left++;
if(left<right)
swap(a[left],a[right]);
}
swap(a[left],a[key]);
return left;
}
void Quicksort(int left,int right)
{
if(left<right)
{
int key=PartSort(left,right);
Quicksort(left,key);
Quicksort(key+1,right);
}
}
int main()
{
int n;cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
Quicksort(0,n-1);
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
return 0;
}
此时时间复杂度为采用随机选择策略的快速排序:
#include<iostream>
#include<cstdlib>
#include<time.h>
using namespace std;
int a[100];
int PartSort(int left,int right);
int Random(int left,int right)
{
srand(time(NULL));
return rand()%(right-left+1)+left;
}
int PartSort(int left,int right)
{
int key=Random(left,right);
while(left<right)
{
while(left<right&&a[right]>=a[key])
right--;
while(left<right&&a[left]<=a[key])
left++;
if(left<right)
swap(a[left],a[right]);
}
swap(a[left],a[key]);
return left;
}
void Quicksort(int left,int right)
{
if(left<right)
{
int key=PartSort(left,right);
Quicksort(left,key);
Quicksort(key+1,right);
}
}
int main()
{
int n;cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
Quicksort(0,n-1);
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
return 0;
}
随机选择算法:
#include<time.h>
using namespace std;
int main()
{
int a[]={1,5,3,2,4,6};
srand(time(NULL));//使得每次运行结果不同
int s0=rand()%6;//得到0-5的任意一个数
int s1=rand()%2+1;//得到1-2(0+1-1+1)的任意一个数
cout<<s0<<" "<<a[s0]<<endl;
cout<<s1<<" "<<a[s1]<<endl;
return 0;
}