• 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]);
    }

    分析快速排序和合并排序的相同点和不同点:
        相同点: 都是迭代操作
        不同点: 快速排序,先分类再迭代;合并排序,先迭代再合并
  • 相关阅读:
    POJ-1189 钉子和小球(动态规划)
    POJ-1191-棋盘分割(动态规划)
    Java实现 LeetCode 730 统计不同回文子字符串(动态规划)
    Java实现 LeetCode 730 统计不同回文子字符串(动态规划)
    Java实现 LeetCode 729 我的日程安排表 I(二叉树)
    Java实现 LeetCode 729 我的日程安排表 I(二叉树)
    Java实现 LeetCode 729 我的日程安排表 I(二叉树)
    Java实现 LeetCode 728 自除数(暴力)
    Java实现 LeetCode 728 自除数(暴力)
    Java实现 LeetCode 728 自除数(暴力)
  • 原文地址:https://www.cnblogs.com/wgang171412/p/4953224.html
Copyright © 2020-2023  润新知