合并排序

思想:二分法,类似于二叉树的形式,不断的拆分,知道每个部分的个数为1,然后返回到根元素,进行排序。

#include <stdio.h>


//合并子序列
void merge(int array[], int start, int mid, int end)
{
	int len_l = mid - start + 1; 		// 左子串长度
	int len_r = end - mid;			//右子串长度
	int len = 0, len_max = 0;		//len:两个字串小值,len_max:两子串长度之和
	int l = start, r = mid + 1;		//l:左子串遍历,r:右子串遍历
	int m = 0;				//局部变量数组索引

	//获取两个子串较小值
	if(len_l > len_r)
	{
		len = len_r;
	}
	else
	{
		len = len_l;
	}
	len_max = end - start + 1;
	int array_t[len_max];
	for(m = 0; len_r != 0 && len_l != 0; m++)
	{
		//取两子串的小值保存
		if(array[l] < array[r])
		{
			array_t[m] = array[l];
			l++;
			len_l--;
		}
		else
		{
			array_t[m] = array[r];
			r++;
			len_r--;
		}
	}
	//其中一条子串为0,则需要将另一条子串的剩余部分连接到局部数组中
	if(len_l == 0)
	{
		while(len_r)
		{
			array_t[m++] = array[r++];
			len_r--;
		}
	}
	else if(len_r == 0)
	{
		while(len_l)
		{
			array_t[m++] = array[l++];
			len_l--;
		}
	}
	//将局部数组的值拷贝到原数组
	for(m = 0; m < len_max; m++)
	{
		array[start + m] = array_t[m];
	}
}

//拆分子序列
void split(int array[], int start, int end)
{
	int i = 0, j = 0;
	int mid;
	if(start == end)
	{
		return;
	}
	else
	{
		mid = start + (end - start) / 2;
		//拆分成两条子串
		split(array, start, mid);  
		split(array, mid + 1, end);
		//按顺序合并
		merge(array, start, mid, end);
	}
	return;
}

int main()
{
	int array[8] = {3, 41, 52, 26, 38, 57, 9, 49};	
	split(array, 0, 7);
	int i = 0;
	for(i = 0; i < 8; i++)
	{
		printf("%d ", array[i]);

	}
	printf("\n");
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值