zoukankan      html  css  js  c++  java
  • c++(合并排序)

         前面一篇博客提到的快速排序是排序算法中的一种经典算法。和快速排序一样,合并排序是另外一种经常使用的排序算法。那么合并排序算法有什么不同呢?关键之处就体现在这个合并上面。
        合并算法的基本步骤如下所示:
        1)把0~length-1的数组分成左数组和右数组
        2)对左数组和右数组进行迭代排序
        3)将左数组和右数组进行合并,那么生成的整个数组就是有序的数据数组


        下面就开始实践操作:
        a)创建函数,判断参数的合法性

    void merge_sort(int array[], int length)
    {
    	if(NULL == array || 0 == length)
    		return ;
    	_merge_sort(array, 0, length-1);
    }

        b)进行merge函数迭代操作
    void _merge_sort(int array[], int start, int end)
    {
    	if(start >= end)
    		return;
    
    	int middle = start + ((end - start) >> 1);
    	_merge_sort(array, start, middle);
    	_merge_sort(array, middle + 1, end);
    	_merge_data_in_array(array, start, middle, end);
    }

        c)对合并后的队列进行合并操作
    void _merge_data_in_array(int array[], int start, int middle, int end)
    {
    	int length = end - start + 1;
    	int* pData = NULL;
    	int left = start;
    	int right = middle + 1;
    	int all = 0;
    
    	/* allocate new memory to the space */
    	pData = (int*) malloc(sizeof(int) * length);
    	assert(NULL != pData);
    	memset(pData, 0, length);
    
    	/* begin to move data */
    	while(right <= end){
    		while(array[left] <= array[right] && left <= middle){
    			pData[all] = array[left]; left ++; all ++;
    		}
    
    		if(left > middle)  {
    			break;
    		}
    
    		while(array[left] > array[right] && right <= end){
    			pData[all] = array[right]; right ++; all ++;
    		}
    	}
    
    	/* move the left data */
    	if(left <= middle)
    		memmove(&pData[all], &array[left], sizeof(int) * (middle -left +1));
    
    	if(right <= end)
    		memmove(&pData[all], &array[right], sizeof(int) * (end - right + 1));
    	
    	memmove(&array[start], pData, sizeof(int) * length);
    	free(pData);
    }
        注: 文中使用的pData动态内存不是一种最优的处理办法,实际开发中可以由其他形式的数据类型代替。

        d)编写测试用例

    static void test1()
    {
    	int array[] = {1};
    	merge_sort(array, sizeof(array)/sizeof(int));
    }
    
    static void test2()
    {
    	int array[] = {2, 1};
    	merge_sort(array, sizeof(array)/sizeof(int));
    	assert(1 == array[0]);
    	assert(2 == array[1]);
    }
    
    static void test3()
    {
    	int array[] = {3, 2, 1};
    	merge_sort(array, sizeof(array)/sizeof(int));
    	assert(1 == array[0]);
    	assert(2 == array[1]);
    	assert(3 == array[2]);
    }
    
    static void test4()
    {
    	int array[] = {4, 3, 5, 1};
    	merge_sort(array, sizeof(array)/sizeof(int));
    	assert(1 == array[0]);
    	assert(3 == array[1]);
    	assert(4 == array[2]);
    	assert(5 == array[3]);
    }

    分析快速排序和合并排序的相同点和不同点:
        相同点: 都是迭代操作
        不同点: 快速排序,先分类再迭代;合并排序,先迭代再合并
  • 相关阅读:
    17 Letter Combinations of a Phone Number(medium)
    16 3Sum closest(medium)
    15 3Sum(medium)
    linux环境下搭建自动化Jenkins管理工具
    Danjgo学习笔记(五)----Django数据库的查询
    Danjgo学习笔记(五)----Django中表的关系
    Django常见的Field
    selenium+python+ip池 实现博客园刷博客浏览量
    Danjgo学习笔记(五)----常见模板过滤器和自制过滤器
    Danjgo学习笔记(四)---danjgo框架内的常用标签
  • 原文地址:https://www.cnblogs.com/wgang171412/p/4953224.html
Copyright © 2011-2022 走看看