归并排序—merge算法

Posted 超浪*牛

tags:

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

将两个有序数列合并成一个有序数列,我们称之为:归并

1.怎么分?
在这里插入图片描述
2,有序的两个半段怎么合?
有图演示:
在这里插入图片描述
代码演示:

/***********************************************************
*版权所有:(C) 2021.6.10  烽火大队-狼烟一号(第八方面军) 
 * 
*文件名称:merge_sotr 
*内容摘要:排序算法 
*当前版本:1-1 
*文件作者:牛鹏 
*完成日期:2021.6.10
*备注:感谢烽火——帅子红——副队长大力支持
*修改记录:暂无 
***********************************************************/
#include <stdio.h>
#include <stdlib.h>
void merage(int a[],int start,int mid,int end){//下标i位 ; 
	int *temp = (int *)malloc((end-start+1)*sizeof(int));// 
	int i = start;//开始点 
	int j = mid+1;//第二个开始点 
	int k = 0;
	while(i<=mid && j<= end){
		if(a[i]<=a[j]){
			temp[k++] = a[i++];
		}else{
			temp[k++] = a[j++];
		}
	}//merge思想 
	while(i<=mid)
		temp[k++] = a[i++];
	while(j<=end)
		temp[k++] = a[j++];
	for(i=0;i<k;i++){
		a[start+i] = temp[i];
	}
	free(temp); 
}
void sort(int a[],int start,int end){
	if(a==NULL || start>=end){
		return;
	}
	int mid = (end+start)/2;
	sort(a,start,mid);
	sort(a,mid+1,end);
	merage(a,start,mid,end);
} 
int main() {
	int a[] = {6,1,2,7,9,3,4,5,10,8};
	int i;
	for(i=0;i<10;i++){
		printf("%d ",a[i]);
	}
	sort(a,0,9);
	printf("\\n排序后↓:\\n"); 
	for(i=0;i<10;i++){
		printf("%d ",a[i]);
	}
	return 0;
}
  • 归并排序算法在排序过程中,相同元素的前后顺序并没有改变,所以归并排序是一种稳定排序算法
  • 归并排序算法每次将序列折半分组,共需要logn轮,因此归并排序算法的时间复杂度是O(nlogn)
  • 归并排序算法排序过程中需要额外的一个序列去存储排序后的结果,所占空间是n,因此空间复杂度为O(n)

结果演示:在这里插入图片描述

以上是关于归并排序—merge算法的主要内容,如果未能解决你的问题,请参考以下文章

排序算法--Merge Sorting--归并排序--Merge sort--归并排序

归并排序—merge算法

归并排序(Merge Sort)思想,代码实现

[算法]——归并排序(Merge Sort)

js 实现排序算法 -- 归并排序(Merge Sort)

归并排序(Merge Sort)