浅学快排算法

快排

快排的思想:分治

分治:将一个大问题划分为小的部分,接着一个个去解决

步骤

1.取分界点 :选最左边的为分界点(按个人习惯)。
2.调整区间:分界点的左边小于分界点值,右边的大于。
3:递归处理左右两端

下面是一组试数: 3 5 2 7 6

规定:起初选最左边为分界点。 i 指向最左边 ,j指向最右边。

首先 :1. i 先移动 。i在3的位置, 3不小于3 i 停下来。 j移动,一直移动到2的位置停下来。

2然后 i此处的位置 与 j此处的位置交换。

3. 重复1 2 的步骤。 直到 i = j ,初步排序停下来

4.开始分治:用递归

左组:2就一个数字可以不用管了,对于本题
右组: 5 3 7 6 继续执行 1. 2 . 3 .4的步骤


上面是大致的思想,但是快排里面有个小细节问题:边界问题。针对于这个问题解决的最好方法是背模板(下面我会展示一个比较简单理解的模板),当然如果你的大脑转的很快,当我没说。


具体代码实现

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void  quick_sort(int q[], int L, int R)
{
	int x = q[L], i= L - 1, j = R + 1;
	if (L== R) return;
	while (i < j) {
		do i++; while (q[i] < x);
		do j--; while (q[j] > x);
		//必须要在i<j时才能交换
		//if不能放在while循环的外面的   试数  1  3  7  6  5   8  如果选6为X  if放在外面会出现死循环  i永远小于j

		if(i<j)swap(q[i], q[j]);


	}
	//进行分区处理
	quick_sort(q,L,j);
	quick_sort(q, j+1, R);//这里不能用i,试数 2 1,这里会一直是quick_sort(q,0,1),死循环;    


}

int main(void) 
{
	int t = 0;//数字个数
	int n = 0;//要写入的数
	scanf("%d", &t);
	int q[1000];
	for (int k = 0; k < t; ++k)
	{
		scanf("%d", &n);
		q[k] = n;
	}
      quick_sort(q,0,t-1);
	for (int k = 0; k < t; ++k)
	{
		printf("%d\n",q[k]);
		
	}
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值