个人对于八大排序总结(中1)

博客介绍了快速排序,其基本思想是将数据一趟分成两部分,使前部分数据都小于后部分,再递归划分。文中介绍了两种算法,单向指针扫描法只有一个指针主动扫描,双向指针扫描法有左右两个指针双向比较,双向法复杂度高但效率更快。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

5.快速排序

基本思想:一趟把数据分成俩个部分,第一个部分所有的数据都比第二个部分所有的数据小,每一趟都按照之前的那种思想,把前一个部分也化成俩部分,后面一部分也化成俩部分,依次递归下去...

个人理解的快速排序有俩种算法

目录

1.单向指针扫描法;

2.双向指针扫描法;


单向指针扫描法:

思想:意思是只有一个指针是主动扫描,这个指针所指向的数据和某个数据进行比较,如果大于某个固定数字,就把该数据放到后面,如果小于某个数据,该指针直接移向下一个数据,再进行比较。然后再进行递归的把左右划分好的区间再一次进行比较。

所以该方法将使用一个循环,使指针移动,完成一次数据风格,然后递归

具体核心代码如下:

void kuaipaione(int a[max],int p,int r){//5
	int q;
	int pivot;//固定对比数据
	int right;//被动移动的指针
	int sp;//移动比较的指针
	if(p<r){
		pivot=a[p];
		right=r;
		sp=p+1;
		while(sp<=right){//指针开始移动
			if(a[sp]<=pivot){//如果小于固定数据指针下移
				sp++;
			}else{
				swap(a,sp,right);//大于把这个数放到后面
				right--;//范围缩小
			}
		}
		swap(a,p,right);//right指针指向的位置就是固定数据应该在的位置
		q=right;
		kuaipaione(a,p,q-1);//缩小范围进行下一次递归
		kuaipaione(a,q+1,r);
	}
}

小结:每当sp指针数和right交换的时候,right必须减1,缩小范围,使sp和right不断靠近,直到sp>right这个时候right指向就是整个数据被pivot分成俩个部分的中间位置,再把pivot放到中间位置,一趟就完成,接下来就是递归,边界不包含right所在的数据


双向指针扫描法:

思想:故名思意就是有一左一右俩个指针双向和固定数据pivot进行比较,如果左边数据>pivot并且右边数据<pivot,就将俩边的数据进行交换同时俩个指针相向移动,直到左右俩个指针交错,才结束一趟,接下来依次对左右俩个区域进行递归...

双向比单向多了一个指针,算法的复杂度更高,但是效率更快

具体核心代码如下:

void kuaipaitwo(int a[max],int p,int r){//6
	int q;
	int pivot;//固定数据
	int left;//左指针
	int right;//右指针
	if(p<r){
		pivot=a[p];
		left=p+1;
		right=r;
		while(left<=right){
			while(left<=right&&a[left]<=pivot){//左指针小于pivot不用交换
				left++;
			}
			while(left<=right&&a[right]>pivot){//right大于pivot不用交换
				right--;
			}
			if(left<=right){//当左大pivot并且右小于pivot相互交换
				swap(a,left,right);
			}
		}
		swap(a,p,right);//出循环时候right指向依然是数据分开位置,把pivot放right上面
		q=right;
		kuaipaitwo(a,p,q-1);//递归
		kuaipaitwo(a,q+1,r);
	}
}

小结:刚开始left>right当出循环的时候,right所在位置左边数据都比右边数据小,然后把right位置上面的数据和pivot交换,依次递归。

喜欢看的朋友记得点个关注哟!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值