快速排序的实现

c++与C语言中库函数快速排序的实现

首先先附上完整代码

#include<iostream>


using namespace std;

//快速排序

void sort_t(int a[],int left,int right)
{
	if(left>=right)
		return;
	int i,j;
	i=left;
	j=right;
	int temp=0;
	int t=a[left];
	while(i!=j)
	{
		while(a[j]>=t&&i<j)
		{
			j=j-1;
		}
		while(a[i]<=t&&i<j)
		{
			i=i+1;
		}
		if(i<j)
		{
			temp=a[i];
			a[i]=a[j];
			a[j]=temp;
		}
	}
	a[left]=a[i];
	a[i]=t;
	sort_t(a,left,i);
	sort_t(a,i+1,right);

}
int main(int argc, char const *argv[])
{
	
	int a[10]={0,2,3,4,1,6,5,7,9,8};
	sort_t(a,0,10);
	for (int i = 0; i < 10; ++i)
	{
		cout<<a[i]<<" ";
		/* code */
	}
	cout<<endl;
	return 0;
}

快速排序算法的实现思想———分治法

分治法的基本思想就是将一个大问题分解成性质相同的小问题,使用递归的方法解决这问题,最后将这些小问题合并,答案就会出来。
快排算法正是基于这个思想,首先在你的输入数组中取一个值,将这个数组分为左右2个数组,左面是小于这个数的,而右面是大于这个数,通过递归一直递归下去,可想而知数组就会在递归完成时排序成功。
主要的问题就在这个分上面,下面是分的代码

	i=left;
	j=right;
	int temp=0;
	int t=a[left];
	while(i!=j)
	{
		while(a[j]>=t&&i<j)
		{
			j=j-1;
		}
		while(a[i]<=t&&i<j)
		{
			i=i+1;
		}
		if(i<j)
		{
			temp=a[i];
			a[i]=a[j];
			a[j]=temp;
		}
	}

这部分的代码主要就是实现将自己的输入数组分块。
下面我们通过一个案例来演示一下快速排序的基本步骤: 以序列 46 30 82 90 56 17 95 15 共8个元素

初始状态: 46 30 82 90 56 17 95 15 选择46 作为基准值,i = 0, j = 7

i = 0 j = 7

15 30 82 90 56 17 95 46 15 < 46, 交换 15 和 46,移动 i, i = 1

i = 1 j = 7

15 30 82 90 56 17 95 46 30 < 46, 不需要交换,移动 i , i = 2

i = 2 j = 7

15 30 46 90 56 17 95 82 82 > 46, 交换82 和 46,移动 j , j = 6

i = 2 j = 6

15 30 46 90 56 17 95 82 95 > 46, 不需要交换,移动 j , j = 5

i = 2 j = 5

15 30 17 90 56 46 95 82 17 < 46, 交换46 和 17,移动 i, i = 3

i = 3 j = 5

15 30 17 46 56 90 95 82 90 > 46, 交换90 和 46,移动 j , j = 4

3 = i j = 4

15 30 17 46 56 90 95 82 56 > 46, 不需要交换,移动 j , j = 3

i = j = 3

i = j = 3, 这样序列就这样分割成了两部分,左边部分{15, 30, 17} 均小于 基准值(46);右边部分 {56, 90,95,82},均大于基准值。这样子我们就达到了分割序列的目标。在接着对子序列用同样的办法进行分割,直至子序列不超过一个元素,那么排序结束,整个序列处于有序状态。

本文本本参考:https://www.cnblogs.com/surgewong/p/3381438.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值