归并排序及具体介绍

#include<stdio.h>
#include<stdlib.h>

//复杂度分析

//T(N) = T(N/2) + T(N/2) + O(N)       T(N) = O(NlogN)

//归并作用是将两个序列合并 L = 左边起始位置,R = 右边起始位置 RightEnd = 右边终点位置
void Merge(int A[],int TmpA[],int L,int R,int RightEnd)
{
	int LeftEnd = R -1;         //左边终点位置 左右两列挨着
	int Tmp = L;                //存放结果初始位置
	int NumElements = RightEnd - L + 1;       //存放元素总个数
	while(L <= LeftEnd && R<= RightEnd)       //当左右两边都存在元素时比较大小将小的哪一个存入数组Tmp中
	{
		if(A[L] <A[R] )        //如果左边的值小则将左边的元素存入数组中
			TmpA[Tmp++] = A[L++];
		else                   //反之
			TmpA[Tmp++] = A[R++];
	}
	while(L <= LeftEnd)         //如果左边的数组长一点则将后面的直接存入数组
		TmpA[Tmp++] = A[L++];
	while(R <= RightEnd)
		TmpA[Tmp++] = A[R++];  //反之
	for(int i = 0; i < NumElements;i++,RightEnd --)  //用NumElem来控制赋值的次数
		A[RightEnd] = TmpA[RightEnd];
}

//归并排序 一直递归 然后返回进行排序 L = 初始位置  RightEnd = 结束位置
void MSort(int A[],int TmpA[],int L,int RightEnd)
{
	int Center;                  //用来存放中间位置
	if(L < RightEnd)
	{
		Center = (L + RightEnd) / 2;     //算出中间位置
		MSort(A,TmpA,L,Center);          //递归左侧
		MSort(A,TmpA,Center+1,RightEnd); //递归右侧
		Merge(A,TmpA,L,Center+1,RightEnd);       //对递归完后的程序进行合并
	}

}

//统一函数借口减少参数数量
void Merge_sort(int A[],int N)
{
//	int *TmpA;                       //动态分配一个和A数组等大的数组TmpA
//TmpA = (int *)malloc(sizeof(A));
	int TmpA[100];
	MSort(A,TmpA,0,N-1);
}

int main()
{
	int a[11] = {1,3,5,7,9,2,4,6,8,10,20};
	int b[11] = {0};                      //从当temp数组
//	Merge(a,b,0,5,10);                    //合并的测试
	MSort(a,b,0,10);
	for(int i=0;i<11;i++)
	{
		printf("%d ",a[i]);
		if(i==10)
			printf("\n");
	}
	int c[11] = {1,9,5,2,3,4,6,7,8,5,2};
	MSort(c,b,0,10);
	for(int i=0;i<11;i++)
	{
		printf("%d ",c[i]);
		if(i==10)
			printf("\n");
	}
	/////////////////////
	int d[5] = {3,8,6,5,2};
	Merge_sort(d,5);
	for(int i=0;i<5;i++)
	{
		printf("%d  ",d[i]);
		if(i==4)
			printf("\n");
	}
	system("pause");
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-07 23:21:13

归并排序及具体介绍的相关文章

数据结构——排序算法总结

排序(Sorting)就是将一组对象依照规定的次序又一次排列的过程,排序往往是为检索而服务的.它是数据处理中一种非常重要也非经常常使用的运算.比如我们日常学习中的查字典或者书籍的文件夹.这些都事先为我们排好序,因此大大减少了我们的检索时间,提高工作效率. 排序可分为两大类: 内部排序(Internal Sorting):待排序的记录所有存放在计算机内存中进行的排序过程: 外部排序(External Sorting):待排序的记录数量非常大,内存不能存储所有记录.须要对外存进行訪问的排序过程. 外

排序(文献摘要)

<排序思想> 博客分类: 数据结构 排序插入排序交换排序选择排序归并排序 一.介绍 排序是我们工作中经常碰到的一件事,基本每个项目都涉及到排序运算.一般,排序操作在数据处理过程中要话费许多时间.为了提高计算机的运行效率,人们提出不断改进各种各样的排序算法,而这些算法也从不同角度展示了算法设计的某些重要原则和技巧. 排序就是将一组对象按照规定的次序重新排列的过程,排序往往是为检索服务的.例如,学生档案系统里面的学生成绩信息就是按照学号.年龄或入学成绩等排序后的结果,在排好序的结果里面检索学生成绩

经典排序算法总结(代码) .(转)

经典排序算法总结(代码) ·冒泡法 ·快速排序 ·插入排序 ·希尔(shell)排序 ·选择排序 ·堆排序 ·归并排序   附: 排序算法原理:http://zh.wikipedia.org/wiki/Category:%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95 flash演示:http://www.tyut.edu.cn/kecheng1/site01/suanfayanshi/list.asp?id=7 归并排序的具体介绍在下面的文章里: 递归算法学习---归并

Collections.sort() in JDK1.6

本文主要介绍了Collections.sort方法在JDK1.6中的源码实现(JDK版本1.6.0_45) 1.Collections.sort() public static <T> void sort(List<T> list, Comparator<? super T> c) { Object[] a = list.toArray(); Arrays.sort(a, (Comparator) c); ListIterator i = list.listIterat

JavaScript算法(归并排序与快速排序)

归并排序与快速排序这两个算法放在一起,也是因为时间复杂度都是对数级别的. 目前看过的资料,归并排序看<学习JavaScript数据结构与算法>介绍的归并排序吧,快速排序直接看百度百科,讲的不错.通过这两份资料弄明白实现原理之后,最后看<学习JavaScript数据结构与算法>一书里的JS实现代码. 和之前的一样,嗯,<学习JavaScript数据结构与算法>这本书里都有现成ES5代码,就不在这儿写了,关键是弄清楚原理,然后JS代码每天写两遍,就OK了.ES6的代码周五之

算法和数据结构~各位排序算法的介绍与实现(C#)

排序是指将元素集合按照规定的顺序排列.通常有两种排序方法,升序排列和降序排列.例如,对整数集{5,2,7,1}进行升序排列,结果为{1,2,5,7},对其进行降序排列结果为{7,5,2,1}.总的来说,排序的目的是使数据能够以更有意义的形式表现出来.虽然排序最显著的应用是排列数据以显示它,但它往往可以用来解决其他的问题,特别是作为某些已成型算法的一部分.      总的来说,排序算法分为两大类:比较排序和线性时间排序.比较排序依赖于比较和交换来将元素移动到正确的位置上.令人惊讶的是,并不是所有的

比较排序算法的简单介绍和复杂度分析

标题长坑,就拿最近有在用的来弄吧,先写个大概,以后逐渐完善. 对于以下代码,默认包含头文件: #include<algorithm> 1.冒泡排序(Bubble Sort) 先从课本上最常见的冒泡排序说起吧,C++代码如下(个人习惯介绍算法使用C++,比伪代码还通俗易懂.......) void BubbleSort(int *A, int n) { for (int i = 0;i < n;++i)//遍历数组 { for (int j = n - 1;j > i;--j)//倒

经典排序算法 - 归并排序Merge sort

经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到所有合并完,形成有序的数组 举例 无序数组[6 2 4 1 5 9] 先看一下每一个步骤下的状态,完了再看合并细节 第一步 [6 2 4 1 5 9]原始状态 第二步 [2 6] [1 4] [5 9]两两合并排序,排序细节后边介绍 第三步 [1 2 4 6] [5 9]继续两组两组合并 第四步 [1 2 4 5 6 9]合并完成,排序完成 输出结

如何使用递归实现归并排序

归并排序:归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序列段间有序.若将两个有序表合并成一个有序表,称为二路归并. 数据结构的学习过程中,我们经常会遇到排序算法,其中归并排序是一种高效并且算法复杂度比较简单的一种.在课本的介绍中,大部分都会介绍归并排序算法.但是,每次看书总是觉得很容易,自己尝试去实现时,总是会出错.学习数据结构已经有一段时间了