归并排序—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算法的主要内容,如果未能解决你的问题,请参考以下文章