分治法与快速排序算法

/*
**分治法与快速排序算法。数组array[p,q]
**1、Divide: 选中数组最左边的起始元素,所有小于起始元素的值都复制到存放起始元素的左边,
**				所有大于起始元素的值都存放到起始元素的右边,并返回起始元素所在的位置r。				
**2、Conquer:	对[p,r)以及[r+1,q)分别递归调用快速排序算法,直到p==q,不在划分,直接返回。
**
**3、Combine:	do nothing
*/
int * partition(int *p,int *q)//获得分割点的位置。
{//以*p为参考值,less指向已搜索的最后一个小于等于*p的元素。more为遍历指针。
//为了保证less指向的是已搜索的最后一个小于等于*p的元素,要求less之前的值全部小于*p,less到more之间的值全部大于*p
	int *less,*more;
	less=p;
	more=p+1;
	while(more<q)
	{
		if(*more>*p)	//应该放在less的右边
			more++;
		else			//应该放到less的左边
		{
			//交换less+1和more所指向的内容,并将less指向当前最后一个小于等于*p的值,即less++
			less++;
			int tmp;		//注意不能使用异或的方式实现数据交换,因为此时less和more可能指向同一内存单元。
			tmp=*less;
			*less=*more;
			*more=tmp;
			more++;
		}

	}
	int tmp=*less;	//交换比较元素和最后一个小于交换元素的位置,使得所有小于交换元素的数据都在其左边......
	*less=*p;
	*p=tmp;
	return p;
}
void quick_sort(int *p,int *q)
{
	if(p==q)
		return;
	int * r=partition(p,q);
	quick_sort(p,r);
	quick_sort(r+1,q);
}
int _tmain(int argc, _TCHAR* argv[])
{
	int num[5];
	printf("input 5 numbers:\n");
	int i=0;
	for(i=0;i<5;i++)
		scanf("%d",num+i);
	printf("the numbers input are:\n");
	for(i=0;i<5;i++)
		printf("%d ",num[i]);
	putchar('\n');
	quick_sort(num,num+5);
	printf("the numbers ordered are:\n");
	for(i=0;i<5;i++)
		printf("%d ",num[i]);
	getchar();
	getchar();
	return 0;
}




                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值