快速排序的图示与代码实现(面试中绝对的加分项)

数据结构:快速排序

1、快速排序

原理通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部采用递归的方式分别对前半部分和后半部分排序,当前半部分和后半部分均有序时该数组就自然有序了。
在这里插入图片描述
先定义一个待end排序数组a[6]
(1)选取数组第一个元素为基准值key ;设置两个标志位begin指向数组的开头,end指向数组的末尾
(2)首先从后往前扫描,如果扫描的数值大于key值,则j自减,j–;如果扫描的数值小于key值 (如上图所示,a[end]❤️), 就将a[i]值赋值给a[i]位置 , 如下图所示:在这里插入图片描述
(3)然后从前往后开始扫描,如果扫描的数值小于key,则i自增,i++;如果扫描的数值大于key,则 则就需要将i位置的值赋值给j位置,a[j] = a[i]; 如a[5] = a[2];如下图所示
在这里插入图片描述
(4)同理再从后往前扫描,如果扫描的数值大于key值,则j自减,j–;如果扫描的数值小于key值 (如上图所示,a[4]❤️), 就将4位置的值赋值给i位置 , a[i] = a[j],如下图所示:

在这里插入图片描述
(5)同理再从前往后开始扫描,如果扫描的数值小于key,则i自增,i++;如果扫描的数值大于key,则 则就需要将i位置的值赋值给j位置,a[j] = a[i];
在这里插入图片描述

(6)如图所示,直到i=j时,查找结束,把key值赋值给a[j];
在这里插入图片描述
(7)则数组就以key值为准,分为两部分,基准值key左半部分的数值都比key值小,右半部分的数值都比基准值大; 最后采用递归的方式分别对前半部分和后半部分排序,直到该数组就自然有序了。
在这里插入图片描述

2、总结

1、首先,设定一个基准数key;a[begin]=key,先从后往前扫描,当a[j]>a[begin]时,j–;当a[j]<key时,将a[i] = a[j];同时将扫描方式改为从前往后扫描;
2,然后,先从后往前扫描,当key>a[i]时,i++;当key<a[i]时,将a[j] = a[i];同时将扫描方式改为从后往前扫描;
3、最后,当i>=j时,将key放于a[i]的位置,则数组就以key值为准,最后采用递归的方式分别对前半部分和后半部分排序,直到该数组就自然有序了。

3、代码实现

void quick_sort(int *a,int begin,int end)
{
	if (begin >= end)
	{
		return ;
	}
	int i = begin;
	int j = end;
	int key = a[i];
	while (i < j)
	{
		while (i < j && key =< a[j])//当基准数key=<a[j]时,j自减,直到key>=a[j]时
		{
			j--;
		}
		a[i] = a[j];// **把a[j]赋值给a[i]**
		while (i < j && key >= a[i])//当基准数key>=a[i]时,i自减,直到key<a[j]时
		{
			i++;
		}
		a[j] = a[i];// **a[i]赋值给a[j]**
	}
	a[i] = key;
	quick_sort(a,begin,i-1);//基准数的前半部分开始递归调用快速排序
	quick_sort(a,i+1,end);//基准数的后半部分开始递归调用快速排序

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值