快速排序
第一步先进行划分 选取基数pivot
第二步左边快排
第三步右边快排
关键
在于get_mid()也就是基数划分函数、
选取最左边为基数
此后二三步进行递归求解
int get_mid(int a[],int left,int right)
{
int pivot=a[left];
while(left<right)
{
while(a[right]>=pivot&&left<right)
{
right--;
}
a[left]=a[right];
while(a[left]<=pivot&&left<right)
{
left++;
}
a[right]=a[left];
}
a[left]=pivot;
return left;
}
void quicksort(int a[],int left,int right)
{
if(left<right)
{
int mid=get_mid(a,left,right);//第一步小放左 大放右
quicksort(a,left,mid-1);
quicksort(a,mid+1,right);
}
}
随机快速排序
在普通快排中基数选取为最左边 没有随机性增加一个随机选取函数
int Random(int l,int r)
{
return 1+(r-1)*(1.0*rand()/RAND_MAX);
}
int get_mid(int a[],int left,int right)
{
int i=Random(left,right);
swap(a[i],a[left]);
int pivot=a[left];
while(left<right)
{
while(a[right]>=pivot&&left<right)
{
right--;
}
a[left]=a[right];
while(a[left]<=pivot&&left<right)
{
left++;
}
a[right]=a[left];
}
a[left]=pivot;
return left;
}
void randomquicksort(int a[],int left,int right)
{
if(left<right)
{
int mid=get_mid(a,left,right);//第一步小放左 大放右
randomquicksort(a,left,mid-1);
randomquicksort(a,mid+1,right);
}
}