《算法导论》——MergeSort

前言:

  在今后的日子里,我将持续更新博客,讨论《算法导论》一书中的提到的各算法的C++实现。初来乍到,请多指教。

今日主题:  

  今天讨论《算法导论》第二章算法基础中的归并排序算法。下面是该算法的代码Merge.h:

  

#include <stdlib.h>

namespace dksl
{
	/*
	* 归并
	* numArray为整形数组
	* head为要归并的数组的开始位置索引
	* waist为要归并的数组的中间位置索引
	* tail-1为要归并的数组的结束位置索引
	*/
	void merge(int *numArray,const int head,const int waist,const int tail)
	{
		int begin=head,start=waist,index=0;
		int length=tail-head;
		int* temp=new int[length];	
		if(temp==nullptr)
			throw "系统为程序分配内存失败";
		while(begin<waist&&start<tail)
		{
			if(numArray[begin]<numArray[start])
				temp[index++]=numArray[begin++];
			else
				temp[index++]=numArray[start++];
		}
		if(begin==waist)
		{
			while(start<tail)
				temp[index++]=numArray[start++];
		}
		else if(start==tail)
		{
			while(begin<waist)
				temp[index++]=numArray[begin++];
		}
		//memcpy(numArray+head, temp, sizeof(int)*length);
		int i=0;
		for(i,index=head;i<length;i++,index++)
		{
			numArray[index]=temp[i];
		}
		delete(temp);
	}

	void sort(int *numArray,const int head,const int tail)
	{    
		int length = tail - head;   
		int  begin = head, middle = ((head+tail)%2 == 0) ? (head+tail)/2 : (head+tail+1)/2, end = tail;    
		if(length < 2) 
			return; 
		else if(length == 2)        
			merge(numArray,begin,middle,end);    
		else    
		{        
			if( middle- begin > 1)            
				sort(numArray,begin,middle);        
			if( end- middle > 1)            
				sort(numArray,middle,end);        
			merge(numArray,begin,middle,end);  
		}
	} 
}

   c++动态数组分配很方便,“int* temp=new int[length]; ”length在程序运行过程中确定。为了养成良好的习惯,请在定义的指针空间使用完后,将其删除。

  下面是本算法的测试代码MergeSort.cpp:

#include "stdafx.h"
#include <iostream>
#include "Merge.h"

using namespace std;
using namespace dksl;
int _tmain(int argc, _TCHAR* argv[])
{
	int a[10] = {1, 4, 8, 5, 10, 25, 54, 15, 12, 2};    
	int i = 0;    
	sort(a, 0, 10);    
	cout<<"The sorted array is:";    
	for(i = 0; i < 10; i++)        
		cout<<a[i]<<" ";   
	cout<<endl;
	system("PAUSE");
	return 0;
}

   运行结果:

posted @ 2013-06-19 22:43  Scott Lewis  阅读(365)  评论(0编辑  收藏  举报