分治2快排

快排就是利用一个标志,左边的都比标志小,右边的都比标志小
所以首先要做的就是确定标志
我们用数组的第一个数代表标志flag = a【start】,
此时start的位置就看成空位由p指向空位
然后进行分别查看,因为是分成两部分,所以一个从前往后一个从后往前比较方便
从后面往前走的指针我们定义为end,从前往后的我们定义为start
当end>start的时候,就说明两指针没有相遇就能操作
当在移动end的时候如果遇到比flag小的就说明应该放在前面空位中,a[p]=a[end] ,
p指向空位p =end;
同理在移动start的时候如果遇到的比flag大就应该放在后面的空位,a【p】=a【start】,p=start;
当两指针相遇时说明所以元素都遍历了一次就该跳出了此时end<=start;
然后递归左右,只不过左右的头尾指针就要变了。

//快排:
#include<iostream>
using namespace std;
void fast_sort( int start,int end); 
int n;
int a[1000];
int main(void)
{
	//输入数据:

	cin>>n;

	int *b;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];//输入每一个数字 
	} 
	//快排
	  fast_sort(  0,n-1); 
	//cout<<n<<endl;
	for(int i=0;i<n;i++)
	{
		 cout<<a[i]<<" ";
	}
	return 0;
} 
void fast_sort( int start,int end)
{
	//首先取开始为flag
	int flag = a[start];
	int s= start;
	int e =end;
	int p = start;//p代表空位
	if(end<=start)
	{
 
		return ;
	}
	while(1)
	{
		//从end开始:
		while(a[e]>flag&&s<e)
		{
			e--; 
		} 
		if(s<=e&&a[e]<flag)//注意while循环是由s==e跳出来的时候执行就要看情况 
		{
			a[p] = a[e];
			p=e;
			e--;
		}
		while(a[s]<=flag&&s<e)
		{
			s++;
		}
		if(s<=e&&a[s]>flag)
		{
			a[p] =a[s];
			p=s;
			s++;
		}
		if(s>=e) break;
		
	} 
	a[p] = flag ;
	//递归做边的;
	 fast_sort(   start , p-1);
	 //递归右边:
	 fast_sort(  p+1, end) ;
 	 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值