归并排序及C语言实现


归并排序:分解待排序的n个元素的序列成各具n/2个元素的两个子序列;使用归并排序递归地排序这两个子序列;合并两个已排序好的子序列生成最终答案。


当排序的子序列长度为1时,递归开始向上合并,直到整个序列排序结束。


其中关键步骤是合并两个子序列:假设桌面有两堆牌面向上的牌,每堆都已经排好序,最小的牌在上面。我们从两堆牌的顶端选取较小的一张,移动到输出堆,并朝下放置。重复这个动作,直到两个堆为空。为了避免在每个步骤都检查是否堆为空,设置两张哨兵牌分别放置在两个堆的最下,选取最大值无穷大,当执行两堆牌总数步时,程序结束。

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>

void merge_sort(int *,int,int);//归并排序函数

main()
{
	int a[10] = {3,6,34,54,32,45,23,67,3,54};
	int i;
	merge_sort(a,0,9);
	for(i = 0;i < 10;i++)
		printf("%d ",a[i]);
	printf("\n");
}
void merge_sort(int *a,int n1,int n2)
{
	int q;
	void merge(int *,int,int,int);
	
	if (n1 < n2) {
		q = (n1 + n2) / 2;//把整个数组序列平均分成两组,递归执行,直到每个组数量为1
		merge_sort(a,n1,q);
		merge_sort(a,q+1,n2);
		merge(a,n1,q,n2);
	}
}

void merge(int *a,int p,int q,int r)//合并过程
{
	int n1,n2,i,j,k;
	int *L,*R;

	n1 = q - p + 1;
	n2 = r - q;
	L = malloc((n1 + 1) * sizeof(int));
	R = malloc((n2 + 1) * sizeof(int));
	for (i = 0;i < n1;i++)
		L[i] = a[p+i];
	for (j = 0;j < n2;j++)
		R[j] = a[q+j+1];
	L[n1] = INT_MAX;//哨兵牌
	R[n2] = INT_MAX;

	for (i = 0,j = 0,k = p;k <= r;k++) {
		if (L[i] <= R[j]) {
			a[k] = L[i];
			i++;
		}
		else {
			a[k] = R[j];
			j++;
		}
	}
	free(L);
	free(R);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值