希尔,归并,快排

#include<iostream>
using namespace std;

void hill(int *a,int len)//希尔 
{
	unsigned sen=len/2;
	while(sen)//sen>=1
	{
		for(unsigned i=sen;i<len;i++)
		{
			unsigned j=i; //添加j过渡使用,用i的话会导致循环无法结束 
				
			int insert=a[i]; 
				
			while(j>=sen && insert<a[j-sen])//这个出错原本是 i>=0 
			{
				a[j]=a[j-sen];
				j-=sen;	
			}
			a[j]=insert;	//插入		
		}
		sen=sen/2;	//缩小长度 
	}
	
}

void adding(int *a,int min,int mid,int max)
{
	int tem[20];//这个可以用动态数组实现
	int m=min,n=mid+1;
	int k=0;//记录tem有多少数据 
	while(m!=mid+1 && n!=max+1)//来回比较两边,如果有一边满了则退出循环 
	{
		if(a[m]<a[n])
		{
			tem[k++]=a[m++];
		}
		else
		{
			tem[k++]=a[n++];
		}
	} 
	
	if(m!=mid+1)//将另一组未满的加上 
	{
		while(m!=mid+1)
			tem[k++]=a[m++];
	}
	else
	{
		while(n!=max+1)
			tem[k++]=a[n++];
	}
	
	//k为tem容量 
	for(int i=0,j=min;i<k;i++)//min为原生数组的首部 
	{
		a[j++]=tem[i];
	}
	
}

void merger(int *a,int min,int max)//归并 
{
	if(min<max)
	{
		int mid=(max+min)/2;
		merger(a,min,mid);
		merger(a,mid+1,max);
		adding(a,min,mid,max);
	} 
}

void quick(int *a,int min,int max1) //快排 
{
	if(min>max1)
		return;
	//先从右到左找比基数小的,再从左到右找比基数大的
	//填坑法 
	int i=min,j=max1;
	int pause=a[min]; 
	while(i<j)
	{
		while(a[j]>=pause && i<j)
		{
			j--;
		}
		if(i<j)
			a[i++]=a[j];
		while(a[i]<pause && i<j)
		{
			i++;
		}
		if(i<j)
			a[j--]=a[i];
	}
 	a[i]=pause;
	
	
	quick(a,min,i-1);
	quick(a,i+1,max1);
}

int main()
{
	int a[10]={10,9,8,7,6,5,4,3,2,1};
	size_t data=sizeof(a)/sizeof(int);
	
/*	if(data!=1)
		hill(a,data);*/
		
//	merger(a,0,data-1); 

	quick(a,0,data-1);
	
    for(auto it : a)
    {
        cout<<it<<ends;
    }
	return 0;	
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值