关闭

分治排序示例

2018人阅读 评论(0) 收藏 举报

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

//链接是: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
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:865810次
    • 积分:5847
    • 等级:
    • 排名:第4361名
    • 原创:96篇
    • 转载:63篇
    • 译文:1篇
    • 评论:75条
    最新评论