排序大法之归并排序

归并过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二个有序表中的元素a[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到r中从下标k到下标t的单元。归并排序的算法我们通常用递归实现,先把待排序区间[s,t]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间[s,t]。(来自百度百科的解释)

  要求对递归函数有一定的理解

实现代码:

#include<iostream>
#define INF 99999999
using namespace std;
int L[20];
int R[20];
void merge(int a[],int left,int mid,int right)
{
	int i;
	int n1 = mid - left + 1;  // 左边数组元素个数 
	int n2 = right - mid;  //  右边数组元素个数 
	for(i = 0; i < n1; i++)  // 
	{
		L[i] = a[left+i];
	}
	for(i = 0; i < n2; i++)
	{
		R[i] = a[mid+i+1];
	}
	L[n1] = INF;   // 将数组L与R的最后一个元素置为INF,就不用最后再检查一次某个数组是否读完 
	R[n2] = INF;
	int l,r;
	l = r = 0;
	for(int k = left; k <= right; k++)
	{
		if(L[l] <= R[r])
		{
			a[k] = L[l++];
		}else
		{
			a[k] = R[r++];
		}
	}
}

void merge_sort(int a[],int left,int right)
{
	if(left < right)
	{
		int mid = (left + right) / 2;
		merge_sort(a,left,mid);
		merge_sort(a,mid+1,right);
		merge(a,left,mid,right); 
	}
} 
int main()
{
	int a[6] = {3,2,1,8,7,9};
	merge_sort(a,0,5);
	for(int i = 0; i < 6; i++)
	{
		cout<<a[i]<<" ";
	}
	return 0;
} 
PS:以后再来看,理解的不是很深刻

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值