算法 归并排序

核心思想:将多个有序数组进行合并变成一个有序的

1.获得中间位置mid

2.左 起始~mid

右 mid+1~结束

3.合并(合并两个有序数组,方法有点像合并两个有序链表)

void hebing(int *arr,int begin,int end) {
	//获取中间值
	int mid = (begin + end) / 2;
	//申请一个与数组长度相同的新数组
	int* newarr = (int *)malloc(sizeof(int) * (end - begin + 1));
	//左半部分起始是begin,结束是mid
	int left = begin;
	//左半部分起始是mid+1,结束是end
	int right = mid + 1;
	//标记下一次插入到新数组的位置
	int index = 0;
	//循环比较左半部分和右半部分谁小谁插入到新数组,知道一边已经走完
	while (right <= end && left <= mid) {
		if (arr[right] < arr[left]) newarr[index++] = arr[right++];
		else newarr[index++] = arr[left++];
	}
	//把没有走完的一边的剩余的元素放入到数组中
	while (left <= mid)
	{
		newarr[index++] = arr[left++];
	}
	while (right <= end)
	{
		newarr[index++] = arr[right++];
	}
	//这里index--是因为每次插入后都会index++
	//最后一次插入后index就不需要++了要把多加的减回来
	index--;
	//再把插入到新数组的值插入回原数组
	while (index >= 0) {
		arr[begin+index] = newarr[index];
		index--;
	}
	//释放申请的新数组
	free(newarr);
    newarr = NULL;
}
//归并排序
void guibingSort(int* arr, int begin, int end) {
	//获得中间值
	int mid = (begin + end) / 2;
	//起始和结束相同时说明就剩一个元素,有序了,返回
	if (begin == end) {
		return;
	}
	guibingSort(arr, begin, mid);//处理左半部分
	guibingSort(arr, mid+1, end);//处理右半部分
	hebing(arr, begin, end);//两边处理完都有序了就合并
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值