归并排序算法小结

归并排序

1.算法描述

归并排序的思想,在之前我们也都已经遇到过了,就是将一个完整的无序的序列,变成两个无序的序列,同时对左右两个无序序列进行排序,最终,对两个序列进行合并,最后我们可以就可以得到一个有序的序列。分别对左右两边进行排序的话,我们可以采用递归的算法。关键的问题在于如何进行合并

2.算法实现&&描述

#include <stdio.h>
void merge(int *(number),int *ST,int left,int mid,int right)//实现合并
{
	int i = left;
	int j = mid + 1;
	int oi = left;
	for(i,j;i<=mid&&j<=right;left++)
	{
		if(ST[i]>ST[j])//比较左右两边的值
		{			//因为两边都是有序的,那我们只需要从有序的数组中取最小的元素赋给原数组
			number[left] = ST[j++];
		}
		else
		{
			number[left] = ST[i++];
		}
	}
	if(i<=mid)//将剩下的辅助数组中的其他元素赋给原数组
	{
		while(left<=right)
		{
			number[left] = ST[i];
			i++;
			left++;
		}
	}
	if(j<=right)
	{
		while (left<= right)
		{
			number[left] = ST[j];
			j++;
			left++;
		}
	}
	for(int i=oi;i<=right;i++)
	{
		ST[i] = number[i];//将合并后的值赋给辅助数组
	}
	return;
}

void merge_sort(int *number,int (*ST),int left,int right)//归并排序
{
	if(left==right)
	{
		ST[left] = number[left];
	}
	else 
	{
		int mid = (left+right)/2;
		merge_sort(number, ST, left, mid);//左右分别进行归并排序
		merge_sort(number, ST, mid + 1, right);
		merge(number, ST, left, mid, right);//左右合并
	}
}

int main() 
{
	//下面是测试内容
	int maxn = 105;
	int number[105];
	int ST[105];
	for(int i=1;i<=10;i++)
	{
		number[i] = 10 - i;
	}
	merge_sort(number, ST, 1, 10);
	puts("");
	for(int i=1;i<=10;i++)
	{
		printf("%d", number[i]);
	}
	//输出为0123456789
	return 0;
}

书上的实现秀的我头皮发麻,一脸懵逼,与书上的思想基本上一致,只是增加了一个赋值给辅助数组的操作,我觉得这样比书上的更好理解.欢迎大家跟我讨论呀。?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值