分治排序示例

//此处只贴了代码,具体的执行过程在我的百度空间中给出了,就不搬过来了!

//链接是:http://hi.baidu.com/wolinxuebin/blog/item/996f6dc851ca7ee252664f8e.html

 

// InsertionSort.cpp : 定义控制台应用程序的入口点。
//

//#include "stdafx.h"
#include<iostream>
using namespace std;

#define MAXNUM 2147483647   //定义无穷大

void merge(int *a,int p,int q,int r);//合并算法
void mergeSort(int *a,int p,int r);        //合并排序

int main()
{
	int size, *a;
	while(1)
	{
		cout<<"输入字符串长度:"<<endl;
		cin>>size;          //输入字符串长度
		if(size > 0) {
			cout<<"请输入"<<size<<"个待排序数字:"<<endl;
			a = new int [size]; //开辟动态数组空间
			for(int i=0; i<size; i++)
			{
				cin>>a[i];
			}
			mergeSort(a,1,size); //调用分治排序程序
		}
		else
			cout<<"输入长度错误!"<<endl;

		for(int i=0; i<size; i++)    //打印数组
		{
			cout<<a[i]<<" ";
		}
		cout<<endl;
		}
		return 0;
}

void merge(int *a,int p,int q,int r) //合并算法
{
	int i,j;
	int n1,n2;
	n1 = q - p + 1;
	n2 = r - q;
	int *L = new int[n1+1];		//开辟左右两个数组
	int *R = new int[n2+1];

	for( i=0; i<n1; i++) { L[i] = a[p+i-1];}		//将a中的值赋值给左右数组(L、R)
	for( j=0; j<n2; j++) { R[j] = a[q+j];}
	L[n1] = MAXNUM;			//将数组最后一位用无穷大代替
	R[n2] = MAXNUM;

	i = j =0;
	for(int k=p-1; k<r; k++)
	{
		if(L[i]<=R[j]) {				//比较赋值
			a[k] = L[i];
			i++;
		}
		else {
			a[k] = R[j];
			j++;
		}
	}
	delete []L;					//删除数组释放内存
	delete []R;
}
void mergeSort(int *a,int p,int r)     //合并排序
{
	int q;
	if(p<r){
		q = (p + r)/2;
		mergeSort(a,p,q);
		mergeSort(a,q+1,r);
		merge(a,p,q,r);
	}
}


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值