排序算法之快速排序法

本文详细介绍了使用C语言实现快速排序法的过程。快速排序通过选取基准数,将数据分为两部分,一部分比基准数小,另一部分比基准数大,然后递归地对这两部分进行排序,最终达到整个序列有序的目的。

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

用c语言实现快速排序法

快速排序法感觉听名字它的排序速度就特别快,但是它可并不是最快的排序方法,所有的排序方法的速度都是相对的,没有绝对的最快,如果对于比较杂乱的一组数,快排是一种很好的选择。好了,先讲一讲快排的思想。

现在假如你有一组数需要排序,例如下面这组数:
6 1 2 7 9 3 4 5 10 8
首先我们可以找一个基准数,一般选取最左边,就是6(现在知道为啥我要把6的颜色加深了吧)
现在我们需要做的事就是把比6小的数放在6的左面,把比6大的数放在6的右面。我们先把这串数字存进一个数组中,我们可以找两个变量,一个记做i,一个记做j,它们分别表示这个数组最左边和最右边两个数组的下标,让i从左往右遍历,让j从右往左遍历,这里要注意,因为基准数选取的是最左端,所以让j先从右往左遍历(否则可能发生数组越界问题),当j遍历到一个比6小的数时让它停下,i遍历到一个比6大的数时也让它停下,然后交换i j下标所对应的数,然后继续遍历,直到i,j相遇,相遇时将基准数与相遇时ij下标所对应的数交换,这样一遍下来6左边都是比它小的数了和6右边都是比它大的数了,然后再用相同的方法排左边和右边的数,这里写一个递归函数就解决了,现在我在下面模拟一下过程:
6i 1 2 7 9 3 4 5 10 8j
第一次ij停下
6 1 2 7i 9 3 4 5j 10 8
交换两个位置的数
6 1 2 5i 9 3 4 7j 10 8
6 1 2 5 9i 3 4j 7 10 8
6 1 2 5 4i 3 9j 7 10 8
相遇
6 1 2 5 4 3ij 9 7 10 8
3 1 2 5 4 6ij 9 7 10 8
然后相同的方法排
3 1 2 5 4
9 7 10 8

下面直接给出代码

#include<stdio.h>
void quicksort(int left,int right);
int a[100];//定义一个全局数组 
int main()
{
	int b;
	printf("请输入你要排序的个数");
	scanf("%d",&b);
	for(int c=1;c<=b;c++)
	{
		scanf("%d",&a[c]);
	} 
	quicksort(1,b);
	printf("\n");
	for(int d=1;d<=b;d++)
	{
		printf("%d ",a[d]);
	}
	return 0;
}
void quicksort(int left,int right)
{
	int temp,i,j,t;
	if(left>right)//如果左边数直接大于右边数直接pass掉     还有个作用是排好之后跳出递归 
		return;
	temp=a[left];//先将最左边的基准数赋值给一个变量 
	i=left;
	j=right;
	while(i!=j)//只要i和j不相遇,则一直循环 
	{
		while(i<j&&a[j]>=temp)//从右往左遍历,遇到比基准数小的则停下 
		{
			j--;
		}
		while(i<j&&a[i]<=temp)//从左往右遍历,遇到比基准数大的则停下 
		{
			i++;
		}
		if(i<j)//将两个i j停下地方的数字交换 
		{
			t=a[i];
			a[i]=a[j];
			a[j]=t;
		}
	}
	a[left]=a[i];//交换基准数和ij相遇地方的数字 
	a[i]=temp;//现在基准数左边的数均比它小,右边的数均比它大 
	quicksort(i+1,right);//用相同的方法排左边和右边的数 
	quicksort(left,i-1);
}

我自己的测试结果如下图
在这里插入图片描述
如果对代码有疑问的可以在下方评论联系我。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

囿于之间

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

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

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

打赏作者

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

抵扣说明:

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

余额充值