代码参考自《算法笔记》。
#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;
//默认以A[left]为主元的快排
int Partition_1(int A[],int left,int right)
{
int temp=A[left];
while(left<right)
{
while(left<right&&A[right]>temp)
right--;
A[left]=A[right];
while(left<right&&A[left]<=temp)
left++;
A[right]=A[left];
}
A[left]=temp;
return left;
}
//在数组中随机选择A[p]为主元的快排
int Partition_2(int A[],int left,int right)
{
//在[left,right]范围内随机生成一个下标p作为主元A[p]
int p=(round(1.0*rand()/RAND_MAX*(right-left)+left)); //round()是舍入函数,参数digits没写默认化为整数
swap(A[p],A[left]); //交换A[p]和A[left]
//其他过程和Partition_1相同
int temp=A[left];
while(left<right)
{
while(left<right&&A[right]>temp)
right--;
A[left]=A[right];
while(left<right&&A[left]<=temp)
left++;
A[right]=A[left];
}
A[left]=temp;
return left;
}
//快排主函数
void quickSort(int A[],int left,int right)
{
if(left<right)
{
//将[left,right]按A[left]一分为二
//int pos=Partition_1(A,left,right); //默认以A[left]为主元的快排
int pos=Partition_2(A,left,right); //在数组中随机选择A[p]为主元的快排
quickSort(A,left,pos-1);
quickSort(A,pos+1,right);
}
}
int main()
{
int A[]={5,3,7,6,9,10,2,5,8};
quickSort(A,0,8);
//输出验证
for(int i=0;i<9;i++)
cout<<A[i]<<" ";
cout<<endl;
return 0;
}
对其中“int p=(round(1.0*rand()/RAND_MAX*(right-left)+left));”这句代码的说明:
(1)首先rand()函数可以生成 一个[0,RAND_MAX]范围内的随机数;(包含在<cstdlib>头文件中)
(2)其次用rand()生成的随机数除以RAND_MAX可得到一个[0,1]范围内的浮点数;
(3)用这个浮点数乘以(right-left)就能得到范围在[0,right-left]范围内的浮点数,再加上left便得到范围为[left,right]的浮点数;
(4)最后为了得到整数,使用函数round()得到整数。(包含在<cmath>头文件中。round(number,digits)函数的number是要取舍的数,digits表示小数点后的精度,若digits不写则默认取整)