zoukankan      html  css  js  c++  java
  • 《算法导论》——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;
    }
    

       运行结果:

  • 相关阅读:
    要成功先发疯
    情绪ABC理论
    树立和提高威信法
    javaagent
    sonar 使用
    sonar 代码质量管理
    四大思维工具,SWOT、PDCA、DISC、时间管理
    HyperLogLog
    位数组
    git checkout .和git checkout -f的区别;git add . git add -u git add -A的区别
  • 原文地址:https://www.cnblogs.com/DKSL/p/3145122.html
Copyright © 2011-2022 走看看