一个简单的C语言递归随机快排
为了应付考试,我正在啃胡凡大神的《算法笔记》,其中第四章入门篇(2)中有一个生动的递归随机快排讲解,但是没有全部的代码,只有核心部分。所以我就结合书上的部分把整个的代码写出来。
也算对自己学习过程的一个记录吧。狗尾续貂,不成敬意。
一个高亮代码片
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include<algorithm>
using namespace std;
//选择随机主元对区间进行划分
int randPP(int A[],int left,int right)
{
//生成[left,right]区间内的随机数p
int p=(round(1.0*rand()/RAND_MAX*(right-left)+left));
swap(A[p],A[left]);//交换后A[left]存储主元
int temp=A[left];
while(left<right)
{
while(left<right&&A[right]>temp) right--;//右侧元素只要大于主元就不断左移right
A[left]=A[right];//将该小于主元的数存入A[left]
while(left<right&&A[left]<=temp) left++;
A[right]=A[left];
}
A[left]=temp;//把temp放到left与right相遇的地方
return left;//返回下标
}
//left和right初值是序列首尾下标,例如 1,N;
void quicksort(int A[],int left,int right)
{
if(left<right)
{
int q=randPP(A,left,right);
quicksort(A,left,q-1);//左子区间递归快排
quicksort(A,q+1,right);//右子区间递归快排
}
}
int main()
{
int N;
scanf("%d",&N);
int A[N];
for(int i=0;i<N;i++)
{
scanf("%d",&A[i]);
}
quicksort(A,0,N-1);
for(int j=0;j<N;j++)
{
printf("%d ",A[j]);
}
return 0;
}
快排整体思路:
1.randPP函数调整序列元素,使序列中随机的一个主元左侧所有元素均不超过它,右侧元素均大于它。
2.quicksort函数对该元素左右区间分别进行递归再调整,直到当前调整区间长度不超过1。
而选择随机主元的好处这里不再赘述,感兴趣的朋友可以参考《算法笔记》P144。
(经多次检查,此代码运行无误)