分治排序示例

原创 2012年03月21日 18:23:10

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

//链接是: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);
	}
}


 

版权声明:本文为博主原创文章,未经博主允许不得转载。

ListView的数据排序示例

ListView的数据排序示例         ListView中经常要用到对里面的条目的某一个数据进行排序,比如商品的价格、销售量,机票的数量、价格等。并且有些还要对某些条目进行记录(删除或保留另用...

Java排序之Comparable接口和Comparator接口的比较和应用示例

Camparable接口和Comparator接口的比较和应用示例
  • zolalad
  • zolalad
  • 2014年06月11日 15:39
  • 3825

带箭头排序的ListView示例

  • 2011年10月25日 10:20
  • 85KB
  • 下载

归并排序 C++示例

算法思想描述: 要对一个数组排序,可以将它先分为两个子数组分别排序,最后将结果合并。 下面介绍两种排序:自顶向下的归并排序和自底向上的归并排序。 1:自顶向下的归并排序 对一个数组排序先将左子...

堆排序示例程序的Java源码

  • 2015年03月22日 14:36
  • 5KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:分治排序示例
举报原因:
原因补充:

(最多只允许输入30个字)