快速排序法(详解)C语言

目录

前言

一、认识快速排序

二、使用步骤

1.原理

2.测试

总结


前言

接下来我们来学习算法中的快速排序算法,快速排序算法不同于冒泡排序等基本算法,这是一种快捷,运行时间很短的一种快速对数组元素进行排序的算法。


一、认识快速排序

快速排序法,是给以一个数组,然后对里面的元素进行排序,速度很快,比冒泡排序等一些简单的排序方法,更为快速,与归并排序差不多。

二、使用步骤

1.原理

1)第一步是找数组中随意的一个元素值,设定为x

2)设定两个指针分别为 i j 指向数组左侧 、右侧  ,这里我们设定为 

 i=l-1   j=r+1      这是因为  我们想要第一步进去这个循环的时候就让 l 和 r下标对应元素与x进行比较,i先向右移动 i++ 直到遇到大于等于x的元素 ,停止循环,再让 j 向左移动,j--;直到遇到小于等于x的元素,j停止  交换 i 和 j 对应下标的元素 

3)然后对x左侧的元素进行递归处理,对x右侧的元素进行递归处理,其实也就是 i 或者 j 这个时候i 和 j 是相等的  都是指向x的下标

代码如下(示例):

quick_sort(int q[], int l, int r) {
	if (l >= r) {
		return;

	}  //如果l大于r的话,不用比较了 ,直接返回就可以了  说明没有排序完成或者是一开始传入数值l r就有问题
	int x = q[l];    //x的取值可以为数组中的任意一个元素,但是要知道的是 如果用的l下表对应的元素 后面的递归操作r应该传参为 j  而不是用i  
//防止发生死循环 相应的如果是用 q【r】  那么传参的时候r不能用j  只能用i
	int i = l - 1;
	int j = r + 1; //取的是数组第一个元素的左边的地址,数组最后一个元素的右边的地址,这样进入下面循环就可以直接用do,while进行比较
	while (i < j) {
		do {
			i++;
		} while (q[i] < x);
		do {
			j--;
		} while (q[j] > x);
		if (i < j) {
			int tmp = q[i];
			q[i] = q[j];
			q[j] = tmp;   //当i 和 j都停止的时候 进行交换 下标对应的元素
		}
	}
	quick_sort(q, l, j);//左右遍历  这个时候  i=j且为指向x的下标(因为x为数组中的元素,所以经过上面的循环,i和j指向x了)
	quick_sort(q, j + 1, r);
}

int main()
{
	int n = 0;
	int arr[10000] = {0};
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		scanf("%d", &arr[i]);
	}
	quick_sort(arr, 0, n - 1);
	for (int i = 0; i < n; i++) {
		printf("%d ", arr[i]);
	}
	return 0;
}

2.测试

检验是否排序成功

 对于 i  和  j  最后的位置进行测定  看看是否和 x的下标相同

由此可知,实际上就是如此,得到的  i=j  且为指向x的下标


总结

这一期对于快排的认识就到此为止, 下一期,我们来讲解归并排序的算法内容。

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小王学代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值