归并排序

归并排序是将两个或两个以上有序表合并成一个有序表的过程;
2-路归并排序:n个记录的待排序表,看成n个有序的子表,两两合并,得到[n/2]个长度为2或1的有序表;再两两合并…,如此得到一个长度为n的有序表;

归并思想:当个数(1,0)(1,1)(0,1)时进行合并
[0,              ,mid ,                       ,h]
[0,              ,mid ]
[0,   mid/2]           
[0 ,1][2]
[0][1]                  

左右根:
                         a
                     5/   8\
                     b       c
                 3/  4\    6/ 7\ 
                d      e   f     g
            1 /  2\
            h     i
//递归算法,左右根
void MergeSort(ElemType A[],int low,int high){
	if(low<high){
		int mid=(high+low)/2;					//从中间划分两个子序列
		MergeSort(A,low,mid);					//对左侧子序列递归排序
		MergeSort(A,mid+1,high);				//对右侧子序列递归排序
		Merge(A,low,mid,high);					//归并
	}
}

ElemType *B=(ElemType *)malloc((n+1)*sizeof(ElemType));
//表A两段A[low..mid]和A[mid+1...high]各自有序,合并成新有序表A[low...high]
void Merge(ElemType A[],int low,int mid,int high){
	for(int k=low;k<=high;k++)
		B[k]=A[k];
	for(i=low,j=mid+1,k=i;i<=mid&&j<=high;k++){
		if(B[i]<=B[j])	
			A[k]=B[i++];
		else
			A[k]=B[j++];
	}
	while(i<=mid)	A[k++]=B[i++];
	while(j<=mid)	A[k++]=B[j++];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值