蓝桥杯 算法提高 快速排序(注释详解)

算法提高 快速排序

打卡第四天o( ̄▽ ̄)ブ今天尝试了一下提高题,学习了快速排序的算法。
题目如下
问题描述
  用递归来实现快速排序(quick sort)算法。快速排序算法的基本思路是:假设要对一个数组a进行排序,且a[0] = x。首先对数组中的元素进行调整,使x放在正确的位置上。同时,所有比x小的数都位于它的左边,所有比x大的数都位于它的右边。然后对于左、右两段区域,递归地调用快速排序算法来进行排序。
  输入格式:输入只有一行,包括若干个整数(不超过10个),以0结尾。
  输出格式:输出只有一行,即排序以后的结果(不包括末尾的0)。
输入输出样例
样例输入
5 2 6 1 7 3 4 0
样例输出
1 2 3 4 5 6 7

本来想用sort蒙混过关,但是觉得不太妥当,于是就去学习了递归(真的难)。
首先按题意理清思路,大致就是找一个中间值然后分别从左边和右边依次寻找小于和大于这个数的值的下标,然后与中间值对换,如此往复使中间值摆到数组的最中间.然后递归调用这个函数,分别把这一次设置的中间值左边一个数和右边一个数再设为中间值。如此往复,达到了排序的效果。
老规矩,上代码:

#include<iostream>
using namespace std;

template<class T>
void quicksort(T*a, int const x, int const y)//定义快速排序函数
{
	if (x < y)
	{
		int i = x, j = y;
		int p = a[x];//设数组第一个数为中间值
		do {
			do i++; while (a[i] < p);//由下一个数和中间值比
			//若大于等于中间值,跳出循环,记录下标
			while (a[j] > p)//由最右边的往中间走,与中间值比较
			{
				j--;//记录下标
			}
			if (i < j)  swap(a[i], a[j]);
		} while (i < j);
		swap(a[x], a[j]);//中间值和此时在中央的数互换

		quicksort(a,x,j-1);//递归左
		quicksort(a,j+1,y);//递归右
	}
}
int main()
{
	int i ,num=0,a[11];
	for (i = 0;; i++)
	{
		cin >> a[i];
		if (a[i] != 0)
			num++;//计数器,记录输入几个值
		else
			break;
	}

		quicksort(a, 0, num-1);//0不排

		for (i = 0; i < num ; i++)
			cout << a[i]<<' ';//注意空格
		return 0;
}

实际输出演示:
在这里插入图片描述
继续加油。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值