快速排序

快速排序算法的基本内容:选择一个基准数,然后结合分治法,把数据分为两个部分,如果你想要数据升序排列,那么基准数左边就需要比基准数小,基准数右边就需要比基准数大,如果是降序排列则相反。接下来基准数左右两边数据继续使用快速排序进行排序(一般使用递归),当左边数据或右边数据只剩一个元素时,则说明排序完成。下面我们结合具体数据来说明一下。

将下面这组数据由小到大进行排列.
在这里插入图片描述

1.首先我们先选择一个基准数(base)通常是数据的第一位,也就是4,下标(baseindex)为0;
2.然后开始比较,规则如下:
在这里插入图片描述
(1)从右(right=4)开始向左遍历,找到一个比基准数小的数据,找到之后发现right=3,
data[right]=2;然后把该项数据取走放入基准数所对应的数据项(data[baseindex]=data[right])。如下图

(1)
(2)然后,从左(left=0)开始向右遍历,找到一个比基准数大的数据,找到之后发现left=2,
data[left]=5;然后把该项数据取走放入data[right],所对应的数据项(data[right]=data[left]),由(1)可知right=3。如下图
在这里插入图片描述
(3)从右(right=3)开始向左遍历,我们发现当right>left的情况下,找不到比基准数小的数据。right减1,此时right=left=2为基准元素所在位置,由(2)可知left=2。如下图

在这里插入图片描述
此时我们发现一趟快排完成后,虽然数据还是无序的但基准数base(4)的左边都是小于它,右边都大于它。接着我们继续对在这里插入图片描述
在这里插入图片描述

进行快速排序,直到排序的数据个数等于1则停止排序。

代码如下

#include <iostream>
//start要排数据的开始索引,end要排数据的结尾索引
void KuaiSort(int data[], int start, int end)
{
	//如果只剩一个元素则停止递归
	if (start-end!=1)
	{
		int right{}, left{};		
		left = start;//左起点
		right = end;//右终点
		int base = data[start];//基准元素
		while (right>left)
		{
			//从最右端开始遍历
			while (right>left)
			{
				//找到比基点元素小的元素,填入left的位置
				if (data[right]<base)
				{
					data[left] = data[right];
					break;
				}
				else
				{
					right--;
				}
			}
			//从最左端开始遍历
			while (right > left)
			{
				//找到比基准元素大的元素,填入right的位置
				if (data[left] > base)
				{
					data[right] = data[left];
					break;
				}
				else
				{
					left++;
				}
			}
		}
		//一趟快排结束,right=left以变为中间位置,放入基准元素
		data[right] = base;		
		KuaiSort(data, start, left - 1);//把中间位置的左边元素再进行快速排序
		KuaiSort(data, right + 1, end);//把中间位置的右边元素再进行快速排序
	}
}

int main()
{
	int arry[] = { 4,3,1,2,6 };
	KuaiSort(arry, 0, 4);
	for (int i = 0; i < 5; i++)
	{
		std::cout << arry[i] << "\t";
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值