快速排序

排序算法:简易桶排序、冒泡排序、快速排序

快速排序

前两篇博文讲到的算法都各有千秋,桶排序节省时间但是浪费空间的现象很严重,而冒泡排序内存占用少,但执行的时间效率低,本篇博文就介绍一下既节省空间执行效率也高的算法** 快速排序**。
假设我们要对“6 1 2 7 9 3 4 5 10 8”这10个数排序,首先我们需要先随便找一个数作为**基准数 **(基准数只是用来做参考的数)。比如先以6为基准数,然后从数列两端开始“探测”,从__右__往__左__找比基准数小的数,再从__左__往__右__找比基准数大的数,找到之后,交换两个数的位置。

首先设置两个哨兵i和j。

在这里插入图片描述

因为基准数在左边,所以就先从右边开始探测(如果先从左边开始的话,虽然第第一个基准数可以正确归位,但是接下的基准数归位就回出错),j开始探测(j–),当找到5时停止探测,然后i开始探测(i++),到找到7时停止,这时i和j都找到了符合条件的数,然后就将i和j找到的数位置交换,即

在这里插入图片描述

在这里插入图片描述

然后让哨兵继续探测,j到4的位置停下来,i开始探测,到9的位置停止,然后将9和4的位置交换。

在这里插入图片描述
在这里插入图片描述
i和j的值这时相等了,然后就将6与3的交换,这时第一个基准数6就归位了。

在这里插入图片描述

在这里插入图片描述

z再依次将基准数6左右两边的数归位,具体步骤如下图:

在这里插入图片描述

完整代码如下:

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

void quicksort(int left,int right){
	int i,j; //哨兵i和j
	int temp; //基准数
	int t;
	if(left > right)
		return;
	temp = a[left]; //将最左边的数设为基准数
	i = left;
	j = right;
	while(i != j){
		while(a[j]>=temp && i<j){
			j--;
		}
		
		while(a[i]<=temp && i<j){
			i++;
		}
		//哨兵没有相遇 就将比基准数大的数与基准数小的数交换位置
		if(i<j){
			t = a[j];
			a[j] = a[i];
			a[i] = t;
		}
	}
	//将基准数归位
	a[left] =  a[i];
	a[i] = temp;
	//继续处理基准数右边的数
	quicksort(i+1,right); 
	//处理基准数左边的数
	quicksort(left,i-1); 
	return;
}

int main()
{
	int i;
	scanf("%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]);
	}
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值