归并排序


title: 归并排序
date: 2019-09-18 17:04:34
tags:

1.算法设计

**二路归并排序采用分而制之的方法,先将其一步步拆分

{2 5 3 6 1 4 7 8} --先通过mergesort将数组拆分为单个元素
{2 5 3 6 }{1 4 7 8 }
{2 5 } {3 6} {1 4} {7 8}
{2}{5}{3}{6}{1}{4}{7}{8}
{2 5} {3 6} {1 4} {7 8} --然后在通过merge合并
{2 3 5 6} {1 4 7 8}
{1 2 3 4 5 6 7 8}**

Mergesort算法

void mergesort(int a[],int i,int j){ //i指向left j指向high
int m;
if(i!=j){
m=(i+j)/2;
mergesort(a,i,m);//递归调用mergesort
mergesort(a,m+1,j);// 递归调用mergesort
merge(a,i,j,m);//归并数组
}
}

归并算法:

void merge(int a[],int i,int j,int m)
{
//创建一个辅助数组help
int *help = (int *)malloc((j-i+1)*sizeof(int));//辅助数组长度等于a
int p1=i;
int p2=m+1;
while(p1<=m&&p2<=j){
help[i++]=a[p1]<a[p2]?a[p1++]:a[p2++];//将左右区域较小元素放进help,有可能有的区域没有完全放入help
}
//下面两个循环只能运行一个,
while(p1<=m){
help[i++]=a[p1++];
}
while(p2<=j){
help[i++]=a[p2++];
}
for(int n=0;n<;n++){ //将help中的数据copy到a中
a[n]=help[n];
}
}

2.程序清单

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

void merge(int a[],int l,int r,int mid)
{
	//创建一个辅助数组help
	int *help = (int *)malloc((r-l+1)*sizeof(int));
	//int help[8];//辅助数组长度等于a
	int p1=l;
	int p2=mid+1;
	int k=0;
	while(p1<=mid&&p2<=r){
		if(a[p1]<=a[p2])
			help[k++]=a[p1++];
		else
			help[k++]=a[p2++];
}
//下面两个循环只能运行一个,
while(p1<=mid){
		help[k++]=a[p1++];
}
while(p2<=r){
		help[k++]=a[p2++];
}
for(int n=0;n<(r-l+1);n++)    //将help中的数据copy到a中
	a[l+n]=help[n];

free(help);
}


 
void merge_sort(int a[],int l,int r)
{
    if(l!=r){
	int mid=(l+r)/2;
	
	merge_sort(a,l,mid);
	merge_sort(a,mid+1,r);
	merge(a,l,r,mid);	
	}
}
 
 
void mergesort(int a[],int l,int r)
{
	merge_sort(a,l,r-1);
}
 
int main()
{
	int size,i;
	printf("请输入要创建的数组长度:\n");
	scanf("%d",&size);
	int *a = (int*)malloc(size*sizeof(int));
	//根据需求动态创建数组

	//int a[8],i;
	printf("输入长度为%d的数组\n",size);
	for(i=0;i<size;i++)
	scanf("%d",&a[i]);
	
	mergesort(a,0,size);
	
	for(i=0;i<size;i++)
	printf("%d ",a[i]);
	
	
	return 0;
 } 

3.运行结果

在这里插入图片描述

4.算法复杂度分析

设调用mergesort的执行时间为T(n),由执行过程可知以下递归关系,
T(n)=O(1) 当n=1
T(n)=2T(n/2)+O(n)
其中O(n)为merge所需的时间,设cn(c为正常量)。因此
T(n)=2T(n/2)+cn=2(2T(n/4) +cn/2)+cn=2^2T(n/4)+2cn
=23T(n/23)+3cn

=2kT(n/2k)+kcn
=nO(1)+cnlog2n=n+cnlog2n
=O(nlog2n)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值