数据结构学习笔记——归并排序

Posted 晚风(●•σ )

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构学习笔记——归并排序相关的知识,希望对你有一定的参考价值。

目录

一、排序思想

归并排序是将两个或两个以上的有序表组合成一个新的有序表,它采用的是分治法,例如将两个有序表合并成一个有序表,即二路归并排序。归并排序的具体步骤如下:将含有n个元素的序列分为由n个长度为1的有序子表,相邻的两个有序子表通过归并算法归并为一个有序子表(两两归并),重复以上步骤,最终归并成一个有序表。

例如,对于序列34,15,13,93,65,74,20,17,对其进行归并排序,基本过程如下:

1、将初始序列分为8个只含有1个元素的子序列:

2、第一趟归并。两两归并,形成若干个由两个元素组成的子序列:

3、第二趟归并。继续两两归并,形成两个由四个元素组成的子序列:

4、第三趟归并。继续两两归并,即可形成一个完整的有序序列:

归并排序的是一个递归的过程,分别对划分后的左右子序列进行处理,Merge()函数中借助到了一个辅助数组r1,首先将划分的子序列放在该数组相邻位置,每次从该数组的两段子序列中取出元素进行比较,较小者放回原本的数组r[]中,代码如下,:

/*归并*/
void Merge(int r[],int low,int mid,int high) 
	int *r1=(int *)malloc((high-low+1)*sizeof(int));	//辅助数组r1 
	for(int k=low; k<=high; k++)
		r1[k]=r[k];	//将r中的所有元素复制到r1中 
	for(i=low,j=mid+1,k=i; i<mid&&j<=high; k++) //low指向为第一个有序表的第一个元素,j指向第二个有序表的第一个元素
		if(r1[i]<=r1[j])	//比较r1的左右两段中的元素 
			r[k]=r1[i++];	//将较小值复制到r1中 
		else
			r[k]=r[j++];
	
	while(i<=mid)
		r[k++]=r1[i++];	//若第一个表没有归并完的部分复制到尾部 
	while(i<=high)
		r[k++]=r1[j++];	//若第二个表没有归并完的部分复制到尾部 


/*归并排序*/
void MergeSort(int r[],int low,int high) 
	if(low<high) 
		int mid=(low+high)/2;	//划分 
		MergeSort(r,low,mid);	//对左有序子表递归 
		MergeSort(r,mid+1,high);	//对右有序子表递归 
		Merge(r,low,mid,high);	//归并
	

二、算法分析

分析
(1)归并排序过程中,比较次数与初始序列无关;
(2)二路归并排序中,每选出一个较小的元素需对比元素1次,可推出:在n路归并排序中,每选出一个较小的元素需对比元素的次数为m-1次;
(3)二路归并排序过程,类似于一棵倒立的二叉树,其性质符合二叉树的性质;
(4)空间复杂度:该算法中用到了递归工作栈,递归工作栈的空间复杂度为O(log2n),另外还需用到辅助数组,其空间复杂度为O(n),所以该排序算法的空间复杂度为O(n);
(5)时间复杂度:每趟归并排序的时间复杂度为O(n),整个归并排序共有⌈log2n⌉趟,所以该排序算法的时间复杂度为O(nlog2n);
(6)稳定性:归并排序是一种稳定的排序算法。
(7)适用性:归并排序可适用于顺序存储和链式存储的线性表;
(8)排序方式:归并排序是一种常用的外部排序(Out-place)。

三、总结

排序算法空间复杂度平均时间复杂度最好时间复杂度最坏时间复杂度排序方式稳定性适用性
直接插入排序O(1)O(n2)O(n)O(n2)内部排序(In-place)顺序存储和链式存储
折半插入排序O(1)O(n2)O(nlog2n)O(n2)内部排序(In-place)顺序存储
希尔排序O(1)依赖于增量序列依赖于增量序列依赖于增量序列内部排序(In-place)×顺序存储
冒泡排序O(1)O(n2)O(n)O(n2)内部排序(In-place)顺序存储和链式存储
简单选择排序O(1)O(n2)O(n2)O(n2)内部排序(In-place)×顺序存储和链式存储
快速排序最好为O(log2n);最坏为O(n);平均情况下,为O(log2n)O(nlog2n)O(nlog2n)O(n2)内部排序(In-place)×顺序存储
堆排序O(1)O(nlog2n)O(nlog2n)O(nlog2n)内部排序(In-place)×顺序存储
归并排序O(n)O(nlog2n)O(nlog2n)O(nlog2n)外部排序(Out-place)顺序存储和链式存储

以上是关于数据结构学习笔记——归并排序的主要内容,如果未能解决你的问题,请参考以下文章

数据结构学习笔记——归并排序

数据结构学习笔记——归并排序

python 学习笔记 -- 数据结构与算法 归并排序 Merge Sort

归并排序-学习笔记

学习数据结构笔记====>不同的排序算法(Sort Algorithm)[冒泡,选择,插入,快速,希尔,基数,归并]

算法(第四版)学习笔记——归并排序