小小程序媛  
得之坦然,失之淡然,顺其自然,争其必然

       合并排序(MergeSort)是一种采用分治法策略对一组无序数据进行排序的算法。

       分治法:将原问题划分为n个规模较小而结构与原问题相似的子问题;递归的解决这些子问题,然后合并子问题的结果,就得到原问题的解。分治法在每一层递归上有3个步骤:分解、解决、合并。

       分解(Divide):将原问题分解为一系列子问题。

       解决(Conquer):递归的解各个子问题,若子问题足够小,则直接求解。

       合并(Combine):将子问题的解合并成原问题的解。

 一、合并排序原理

       合并排序(MergeSort)算法完全依照了上述模式,直观的操作如下:

       分解:将n个元素分成各含有n/2个元素的子序列。

       解决:用合并排序法对两个子序列递归的排序。

       合并:合并两个已排序的子序列以得到排序结果。

二、合并排序算法分析
       合并排序采用分治法策略将原问题分解为k的规模较小的子问题,递归求解再合并以得到原问题的解。

       合并排序所用的复杂性分析如下:

     (1)分解:这一步仅是计算出子数组中的中间位置,需要常量时间,因而D(n)=O(1);

     (2)解决:递归的解两个规模是n/2的子问题时间为2T(n/2)

     (3)合并:我们已经注意到在一个含有n个元素的子数组上,Merge过程中的运行时间是O(n),则C(n)=O(n)

整体公式为:

可得:T(n)=O(nlogn) 是渐进意义下的最优算法;

三、合并排序实现

#include <iostream>
#include <stdlib.h>
#include <time.h>
#define N 15
using namespace std;

void Merge(int * array,int low,int middle,int high);
void MergeSort(int * array,int low,int high);
int main()
{
	int array[N];
    srand(time(0));//设置随机化种子,避免每次产生相同的随机数
	for(int i=0 ; i<N ; i++)
	{
		array[i] = rand()%101;//数组赋值使用随机函数产生1-100之间的随机数
	}
	cout<<"排序前:"<<endl;
	for(int j=0;j<N;j++)
	{
		cout<<array[j]<<"  ";
	}
	cout<<endl<<"排序后:"<<endl;
	//调用合并排序函数对该数组进行排序
	MergeSort(array,0,N-1);
	for(int k=0;k<N;k++)
	{
		cout<<array[k]<<"  ";
	}
	cout<<endl;
	return 0;
}//main

void MergeSort(int *array,int low,int high)
{
	if(low<high)
	{
		int middle = (low+high)/2;
		MergeSort(array,low,middle);
		MergeSort(array,middle+1,high);//注意取值middle+1 至 q
		Merge(array,low,middle,high);
	}//if
}//MergeSort
void Merge(int *array,int low,int middle,int high)
{
	int lSize = middle-low+1;//low至middle之间的数据个数
	int rSize = high-middle;//middle至high之间的数据个数
	int *lArray = new int[lSize];//声明左半边数组
	int *rArray = new int[rSize];//声明右半边数组
	for(int i=0;i<lSize;i++)
	{
		lArray[i] = array[low+i];//为左半边数组赋值
	}//for

	for(int j=0;j<rSize;j++)
	{
		rArray[j] = array[middle+j+1];//为右半边数组赋值
	}//for

	/*a为了Array数组的循环变量,b为rArray数组的循环变量,
	 *k为原数组array的循环变量
	 */
	int a=0,b=0,k;
	for(k=low;k<=high;k++)
	{
		if(a>=lSize)
		{
			array[k] = rArray[b++];
		}else if(b>=rSize){
			array[k] = lArray[a++];
		}else{
			if(lArray[a]<=rArray[b])
			{
				array[k] = lArray[a++];
			}else{
				array[k] = rArray[b++];
			}//else
		}//else
	}//for
}//Merge

运行结果:

posted on 2013-01-28 20:04  Coding菌  阅读(517)  评论(0编辑  收藏  举报