【排序算法】快速排序(详细代码)

【排序算法】快速排序

1.【基本思路】

选择排序,都会在一个序列当中选择一个基数,我这里选择最后一个数为基数,小于基数的放在左边,大于基数的放在右边。
这里要采用分治算法:
这里有一个序列
i=0;//i的位置一直会是比基数大的前面一个元素的位置
j=1;//j用来寻找比基数小的数
temp=data[right]//基数选择最左边一个
如果data[j]<=temp当小于我们的基数的时候,就应该放在基数的左边这个时候i++,swap(a[j],a[i])的位置。

13725

这个序列经过一次排序以后变成。

13257

接下来就可以分为两段,5的左边为一段,5的右边为一段。
后面每一段的排序,过程和前面一样。

2.【代码】

#include <bits/stdc++.h>
using namespace std;
/*函数功能:进行排序,将大于基数的放在右边,小于基数的放在左边
函数参数:需要排序元素首地址,需要排序元素右边下标,和左边下标 
函数返回值:基数的位置 
 */ 
int getstrlen(int *data,int left,int right)//治 
{
	int temp=data[right],i=left-1;//这里我们选取最后一个元素作为基数 
	for(int j=left;j<right;j++)
	{
		if(data[j]<=temp)//j作为移动的,i永远是大于基数的前面一个数 
		{
			i++;
			swap(data[i],data[j]);//找到比我们基数小的数就放在左边 
		}
	}
	swap(data[i+1],data[right]); 
	return i+1;
	
}
/*
函数功能:把一个序列分为很多个小段
函数参数:需要排序数组的首地址,需要排序序列的左下标和右下标
函数返回值:无 
*/ 
void sort(int *data,int left,int right)//分 
{
	int i=0;
	if(left>=right)
	return;
	i=getstrlen(data,left,right);
	sort(data,left,i-1);
	sort(data,i+1,right); 
} 
int main()
{
	int a[1000],n;
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	sort(a,1,n);
	for(int i=1;i<=n;i++)
	{
		cout<<a[i]<<" ";
	}
	return 0;
}

仅供参考!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值