快速排序——c语言实现

快速排序的一般过程

快速排序是一种基于分治技术的重要排序算法。

实现过程是每次从排序的序列中选出一个基准值(下文都是以序列左边第一个数为基准,record),left指针指向第一个基准值。

  1. 然后从序列的最右边(right指针)开始,当right指针指向的值大于record值时,right指针减1,继续比较。
    当遇到比基准值小的数(*right<record),就将right指针所指向的值赋给left指针所指向的地址,然后left加1,left指针指向下一个值。
  2. 当left指针指向的值都小于记录值(record)时,指针继续向后移动。
    当*left>record时,将left指针指向的值赋给right指针指向的地址。然后right指针减1,指向前一个值。

重复上面的12两步,直到 left>=rigt 。此时,将记录值赋给left或right所指向的值。

此时,已经将比基准值大的数都移到了右边,比基准值小的都移动到了左边。然后对序列的左边重复上述过程,对序列右边重复上述过程。。直到最后变成单个的元素,就行成了有序的序列。

快速排序过程样例图解

样例按照基准数分类,小的在左边,大的在右边

以6,2,7,8,9,4,5,0,3 为例:
以第一个数6为基准(每次都以最左边的数为基准),并将6记录下来:
( left:左边 right:右边)
首先将6记录下来,left指针指向最左边的数,right指向最右边的数
在这里插入图片描述
在这里插入图片描述
left一开始是作为基准数的,所以从右边right开始比较。right>record,此时,将right所指向的值赋给left(right不用做更改,总有一个相同的,换到最后直接将记录的值给left或者right)
在这里插入图片描述
赋值后将left加1,然后将
left值与record进行比较。
在这里插入图片描述
如果小则left继续加1.大则将left值赋给right。
在这里插入图片描述
在这里插入图片描述
right被赋值之后将right-1.
在这里插入图片描述
然后比较right指向的值,如果right<record,则将right值赋给left。否则继续减1.
在这里插入图片描述
赋值后left加一,比较
left和record值,left>record,将left的值赋给right
在这里插入图片描述
right被赋值后,right减1。
在这里插入图片描述
减一后的
right<record,则将right赋给left,left加一。
在这里插入图片描述
在这里插入图片描述
减一后的left>record,将left值赋给right,right减1.
在这里插入图片描述
在这里插入图片描述
减一后的
right<record,则将right赋给left,left加1。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
当left>=right时,表示分组完毕,此时,将记录的值赋给left或right。
在这里插入图片描述

左边

选择新的基准数3,并且记录下来。排序过程如下。
白色代表已经排好。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

排序完成

在这里插入图片描述

c语言代码

#include <stdio.h>
#include <stdlib.h>
typedef int Elemtype; 
void Quick_Sort(Elemtype *left,Elemtype *right)	//快速排序 
 {
 	Elemtype record,*i,*j,*p2;
 	if(left>=right)	//就剩一个的话直接返回 
 		return ;
 	p2=left;
 	i=left;		//对left,right进行赋值,记录下基准值 
 	j=right;
 	record=*left;
 	while(i<j)	//当left>=right时,结束循环 
 	{
 	while(i<j&&(*j)>record)	//先从右边开始比起 ,遇到比基准值小的进行对left赋值 
 		j--;
 	if(i<j)		
 		{
 			*i=*j;
 			i++;
		 }
	while(i<j&&(*i)<record)	//左边找大于基准值的数,然后对right赋值 
		i++;
	if(i<j)
		{
			*j=*i;
			j--;
		}
	}
	*i=record;	//将基准值赋给left(或right) 
	Quick_Sort(left,i-1);//对基准值左边排序 
	Quick_Sort(i+1,right);//对基准值右边排序 
	return ;
 }
 int main()
{	
	int num;
	char flag;
	Elemtype *p1,*p2;
	printf("请输入要排序的数的个数\n");
	scanf("%d",&num);
	p1=(Elemtype*)malloc(num*sizeof(Elemtype)); //分配空间 
	if(!p1)
	{
		printf("分配不成功\n");
		exit(0);
	}
	printf("请输入排序数\n");
	p2=p1;
	for(;p2<p1+num;p2++)//输入排序数 
		{
			scanf("%d",p2);
		} 
	Quick_Sort(p1,p1+num-1);			
	p2=p1;
	printf("排序后的结果为\n");
	for(;p2<p1+num;p2++)
		{
			printf("%d ",*p2);
		}
	return 0;
 }

运行结果:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

@玉面小蛟龙

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

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

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

打赏作者

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

抵扣说明:

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

余额充值