一个简单的C语言递归随机快排

一个简单的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。
(经多次检查,此代码运行无误)

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值