分治排序示例

原创 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);
	}
}


 

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

相关文章推荐

数据结构示例——堆排序过程

完整算法见[例程],本文用一个例子,演示堆排序的过程。例:对{57, 40, 38, 11, 13, 34, 48, 75, 6, 19, 9, 7}进行堆排序的过程。算法如下:void HeapSo...

冒泡排序示例

一、概念与算法思想 冒泡排序形象的比喻为锅中的开水沸腾,锅中的气泡由锅底向上冒出,气泡由小变大。冒泡排序法又称为交换排序法,由第一个元素开始,比较相邻元素的大小,若按照从小到大排序(a1……a7.....

堆排序的学习示例

android 可拖动排序的源码示例

我从网上看到人家老外写了一个很强大,代码又及其规范的自定义拖动排序控件,在android这种界面很粗燥的系统下,这些自定义控件无疑会让我们的app用户体验度极大的提高,真心十分佩服!!! 下面是效果图...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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