算法学习 2 ---- 快速排序算法

算法学习 2

最常用的排序----快速排序

说到排序算法,大家都会想到的算法会有冒泡排序、桶排序等,快速排序也是比较常用的排序算法之一,下面是本人学习快速排序的时候的一些总结,有不对的地方还希望大家指正!

算法思想:

对于一个序列,我们此时需要将序列进行升序排列,使用快速排序首先需要设置一个基准数(一般选取当前序列的第一个数作为这个基准数),此时设置两个哨兵,这里我们将两个哨兵分别取名为哨兵i和哨兵j,哨兵i放在序列最前面,哨兵j放在序列末尾;我们使用一个变量先存放这个基准数,随后让哨兵j从后面开始往前寻找一个比当前基准要小的数据,找到后停下,随后哨兵i从前往后找,找到一个比基准数大的数据的时候停下(此时哨兵i与j没有碰面),交换哨兵i与哨兵j所指向的数据。随后继续上述操作,直到哨兵i与哨兵j碰面的时候,交换此时哨兵所指向的数据与基准数据,交换完成后,第一轮结束;随后从上一轮基准处将序列分成两个序列,对这两个序列进行上面的操作,直到最后完成排序。

讲述了上面的算法思想时候可能还有人没有弄清楚,没关系,可能是我表达上有些问题,接下来我将会使用图形与文字结合的方式进行讲解。

假设现有一组数据 2 4 5 1 3   需要使用快速排序的方法进行排序,具体实现如下:

1. 将哨兵i和哨兵j分别放置在序列的最前面和最后面(此时将基准设置为序列最前面的数据 2);

2. 由哨兵j开始向前寻找一个小于基准的数据,找到这个数据为1;

3. 哨兵i开始从前向后寻找,找到一个大于基准的数据;

4. 交换哨兵i与哨兵j所指向的数据的位置;

5. j继续向前寻找,此时哨兵j找不到比基准数小的数据,然后会一直向前直到与哨兵i相遇,相遇之后需要交换哨兵i与j所指的数据和基准数据;

6. 从当前哨兵相遇位置作为分界点,2前面的数据进行快速排序(此时只有数据1,不用进行排序),2后面的数据接着进行快速排序。

 

一定要停下来自己试一试,确保自己试完之后再看后面哦!

 

 对序列 5 4 3再进行排序

发现此时哨兵j所指数据小于基准,j不做变化,i向后寻找大于基准的数据,发现直到与哨兵j碰面的时候还是没有找到,交换两者相交后所指数据与基准的位置

 

排序完成,最后总序列排序所得结果为:

 

相信讲解到这里大家应该都明白快速排序的基本思想了吧!

 

看到这里不如给小编点个👍吧!

 

接下来就是最最最重要的,代码实现了,还是希望你可以自己先思考思考怎么样实现,这样对自己的写代码能力才有提升哦!

 

代码实现:

#include <stdio.h>
int a[100],n; 

void quicksort(int left,int right){
	int i,j,t,temp;
	if(left>right)
	 return;    //排除没有输入数据的情况 
	 
	temp=a[left]; //将队列最左边的值作为基准数 
	i=left;       //哨兵i放在最左边 
	j=right;      //哨兵j放在最右边
	 
	while(i!=j){
		while(a[j]>=temp && i<j){
			j--;                //当没有找到比基准小的数据的时候继续向前找 
		}
		while(a[i]<=temp && i<j){
			i++;                 //当没有找到比基准大的数据的时候继续向后找 
		}
		
		if(i<j)
		{                        //找到数据后交换两个数据的位置 
			t=a[i]; 
			a[i]=a[j];
			a[j]=t;
		}
	}
	
	a[left]=a[i];              //当哨兵i与j碰面之后,交换基准数与这个数据 
	a[i]=temp;
	
	quicksort(left,i-1);       //继续处理左边的数据 
	quicksort(i+1,right);      //继续处理右边的数据 
}

int main() 
{
	int i,j,t;
	//读入数据
	printf("请输入你想要输入的数据的个数:");
	scanf("%d",&n);  //输入你想要输入的数据的个数 
	printf("请输入%d个数据:",n);
	for(i=1;i<=n;i++)
	    scanf("%d",&a[i]);
	    
	quicksort(1,n);
	
	for(i=1;i<=n;i++)
	printf("%d ",a[i]); 
	
	getchar(); 
	return 0;
 } 

快速排序就讲解到这里,可以关注小编或者给小编一个小小的赞哦!!😍

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值