`
445822357
  • 浏览: 739053 次
文章分类
社区版块
存档分类
最新评论

Algorithm(二):归并排序

 
阅读更多

归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。


归并排序

  归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

  将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。


代码实现:

void Merge(int startIndex, int midIndex, int endIndex)
{
	int *tmp = (int*) malloc(sizeof(a));
	if (tmp == NULL)
	{
		return;
	}
	
	int i = startIndex;
	int j = midIndex + 1;
	int k = i;
	while ((i <= midIndex) && (j <= endIndex))
	{
		// = guarantee stable sorting
		if (a[i] <= a[j])
		{
			tmp[k++] = a[i++]; 
		}
		else
		{
			tmp[k++] = a[j++];
		}
	}
	while (i <= midIndex)
	{
		tmp[k++] = a[i++];
	}
	while (j <= endIndex)
	{
		tmp[k++] = a[j++];
	}
	// Write back to a[]
	i = startIndex;
	while (i <= endIndex)
	{
		a[i] = tmp[i++];
	}

	free(tmp);

	// Print Current Array
	int length = sizeof(a) / sizeof(int);
	for (int i=0; i<length; ++i)
	{
		printf("%-5d", a[i]);
	}
	printf("\n");
}

void MergeSort(int startIndex, int endIndex)
{
	// if startIndex == endIndex, it is one element
	if (startIndex < endIndex)
	{
		int midIndex = startIndex + (endIndex - startIndex) / 2;
		MergeSort(startIndex, midIndex);
		MergeSort(midIndex + 1, endIndex);
		Merge(startIndex, midIndex, endIndex);
	}
}


分享到:
评论

相关推荐

    算法设计 karatusuba's algorithm 二叉搜索 快速排序 归并排序

    karatusuba's algorithm 计算乘积 从键盘任意输入N个整数 排序后 二叉搜索查询 从键盘输入的某个任意整数的序号 键盘输入N个数 快速排序 将数组的某一段元素进行划分,小的在左边,大的在右边...键盘输入N个数 归并排序

    直接插入排序、希尔排序、起泡排序、快速排序、简单选择排序、堆排序、二路归并排序

    直接插入排序、希尔排序、起泡排序、快速排序、简单选择排序、堆排序、二路归并排序的C++语言实现,亲测可行,二路归并排序未得到预期结果,望指正。

    C#,归并排序算法(Merge Sort Algorithm)的源代码及数据可视化

    归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。...

    归并排序_排序_

    C# 归并排序算法的实例 merge sort algorithm

    Android代码-JS-Sorting-Algorithm

    常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括: 关于时间复杂度: 平方阶 (O(n2)) 排序 各类简单排序:直接插入、直接选择和冒泡排序。...

    SortAlgorithm:在js中实现排序算法

    归并排序 壳排序 堆排序 基数排序 用法 var SortAlgorithm = require ( 'sortAlgorithm' ) ; var sort = new SortAlgorithm ( ) ; sort . bubbleSort ( [ 3 , 1 , 2 , 5 , 4 ] ) ; // return [1,2,3,4,5] var ...

    基础排序, 高级排序, 堆, 二分搜索树, 并查集, 图以及图相关算法知识总结

    归并排序 归并排序改进 归并排序自底向上 快速排序 随机化快速排序 双路快速排序 三路快速排序 堆和堆排序 堆的基本存储 ShiftUp ShiftDown 基础堆排序和Heapify 优化的堆排序 索引堆(IndexHeap) 索引堆的优化 二分...

    sort-algorithm_java.rar_sort_快速排序

    各种排序算法java实现:插入排序、冒泡排序、选择排序、Shell排序、快速排序、改进后的快速排序、归并排序、改进后的归并排序、堆排序!

    java笔试题算法-AlgorithmCode:本仓库整理了LeetCode和剑指offer上的算法题目以及参考代码

    归并排序 yes NlogN N 堆排序 no NlogN 1 快速排序是最快的通用排序算法,它的内循环的指令很少,而且它还能利用缓存,因为它总是顺序地访问数据。它的运行时间近似为 ~cNlogN,这里的 c 比其他线性对数级别的排序...

    常用排序算法复杂度总结

    包含排序类型有以下几种:插入排序,交换排序,选择排序,归并排序,基数排序

    算法:冒泡排序;直接插入排序;希尔排序;快速排序;堆排序;归并排序;基数排序

    算法 原创文章每月最少两篇文章,后续最新文章会在首发,视频首发,大家可以加我进交流群,技术交流或提意见都可以,欢迎星级...排序Algorithm.cpp-C ++版 排序Algorithm.py-Python版 原理说明: 更多精彩,敬请期待!

    leetcode切割分组-java_algorithm:排序算法演示

    leetcode切割分组 ...归并排序 | 外排序 空间复杂度 O(n),需申请与原空间同大空间 HeapSort 堆排序 QuickSort 快速排序 平均时间复杂度 O(n + k) 空间复杂度 O(k) CountingSort | 计数排序 | 用一个计算器

    DataStructure_Algorithm:排序算法

    数据结构算法 (最新工作比较忙,可能不会及时更新,可以将现有的算法重复复习,也可以自己去网上查找其他...归并排序 堆排序 有序摘要的合并 取数字指定数字的字 求整数最大数的数值 找到字符串中第一个不重复的字符

    leetcode1004-AlgorithmClass:算法课实验

    使用递归进行归并排序,需要一个变量来记录递归过程中的层数,当层数为3时输出该段的数据 1006 按堆排序定义操作即可 1007 和1026类似,作业也写过, 考虑最后一个数会和哪些数组合, 写出动态规划的公式即可, 不...

    Sorting-algorithm:排序算法整合

    Sorting-algorithm排序算法整合包含冒泡、选择、归并、快速排序使用java实现

    用Java实现几种常见的排序算法

    用Java语言实现的各种排序,包括插入排序、冒泡排序、选择排序、Shell排序、快速排序、归并排序、堆排序、SortUtil等。 插入排序: package org.rut.util.algorithm.support; import org.rut.util.algorithm....

    Sorting-Algorithm-summary.zip_排序

    排序算法总结,直接排序,冒泡排序,堆排序,二分法排序,归并排序,快速排序,基数排序

    leetcode跳跃-algorithm:算法

    归并排序 快速排序 堆排序 希尔排序(插入排序改良版) 第三部分(commonquestion) 常见的算法 二进制简单算法 二分查找 树的前序、中序、后续遍历 第四部分 剑指offer的算法题目 第五部分(yxxxx.mxx.dxx) 后续的包...

    SortingAlgorithm:基于Java语言的排序算法实现

    Sorting Algorithm一、稳定性稳定:冒泡排序、直接插入排序、归并排序和基数排序不稳定:选择排序、快速排序、希尔排序、堆排序二、排序算法的选择数据规模较小待排序列基本序的情况下,可以选择直接插入排序;...

    leetcode题库-Algorithm:算法

    归并排序 快速排序 基数排序 寻路算法 显式栈或循环代替递归调用 五大常用算法 五大常用算法之一:分治算法 五大常用算法之二:动态规划算法 五大常用算法之三:贪心算法 五大常用算法之四:回溯法 五大常用算法之五...

Global site tag (gtag.js) - Google Analytics