归并排序--排序算法

在这里插入图片描述


//归并排序(分治思想)

//按照快速排序递归地将待排区间依次划分为两个区间,区间只剩一个数的时候停止,
//如果一个区间只有一个数,可以看作是有序区间,然后对左右两个小区间进行归并,归并后依然保持有序
//依次将左右两个有序的子区间归并为一个大的有序区间,并返回给上一次递归
//直到划分的所有小区间归并为一个有序序列,归并排序完成


//时间复杂度O(NlogN)  空间复杂度O(N)	

//=========== 归并排序(递归)

//归并函数
void MergeArray(int arr[], int left, int mid, int right, int tmp[])
{
	int index1 = left;
	int index2 = mid;
	int tmp_index = left; //新数组元素下标从left到right

	while (index1 < mid&&index2 < right) //如果两个有序子数组没有遍历完,一直遍历到某个数组遍历结束
	{
		if (arr[index1] < arr[index2]) //将值小的元素先复制到新数组
			tmp[tmp_index++] = arr[index1++];
		else
			tmp[tmp_index++] = arr[index2++];
	}
	
	while (index1 < mid)//将未遍历完子数组的剩余元素赋值到新数组
		tmp[tmp_index++] = arr[index1++];
	while (index2 < right)
		tmp[tmp_index++] = arr[index2++];
	
	int i = left;  //将tmp排序的元素复制到arr进行合并
	for (; i < right; i++)
		arr[i] = tmp[i];
	return;
}

//递归函数
void _MergeSort(int arr[], int left, int right, int tmp[])
{
	if (right - left <= 1)
		return;

	int mid = left + (right - left) / 2; //将待排序列一分为2,如果某部分元素少于等于1,则认为排好序
	
	_MergeSort(arr, left, mid, tmp);
	_MergeSort(arr, mid + 1, right, tmp);

	MergeArray(arr, left, mid, right, tmp);//合并两个有序区间
	return;
}
//主函数
void MergeSort(int arr[], int size)
{
	if (arr == NULL || size <= 1)
		return;
	int left = 0;
	int right = size;

	int* tmp = (int*)malloc(sizeof(int)*size); //申请空间保存已序区间
	_MergeSort(arr, left, right, tmp);    //递归函数排序
	free(tmp);   
	return;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值