排序算法之归并排序

  • 算法思想:把两个或多个有序的子序列合并为一个
    • 2路归并----二合一
    • n路归并----n合一
    • 若low>high,则将序列从中间mid = (low + high)/ 2分开
    • 对左半部分[low, mid]递归进行归并排序
    • 对右半部分[mid + 1, high]递归进行归并排序
    • 将左右两个子序列合并为一个
  • 空间复杂度:O(n)
  • 时间复杂度:O(nlog n)
  • 稳定
#include<stdio.h>
#include<stdlib.h>


//归并函数
void Merge(int arr[], int low, int mid, int high)
{
	int n = high + 1;
	int* B = malloc(n * sizeof(int));

	int i, j, k;
	for (k = low; k <= high; k++)
	{
		B[k] = arr[k];
	}
	for (i = low, j = mid + 1, k = i; i <= mid && j <= high; k++)
	{
		if (B[i] <= B[j])
		{
			arr[k] = B[i++];
		}
		else
		{
			arr[k] = B[j++];
		}
	}
	while (i <= mid)
	{
		arr[k++] = B[i++];
	}
	while (j <= high)
	{
		arr[k++] = B[j++];
	}
}


//归并排序
void MergeSort(int arr[], int low, int high)
{
	if (low < high)
	{
		int mid = (low + high) / 2;//从中间划分
		MergeSort(arr, low, mid);//对左半部分归并排序
		MergeSort(arr, mid + 1, high);//对右半部分归并排序
		Merge(arr, low, mid, high);//归并操作
	}
}


void main()
{
	int arr[] = { 4,62,632,6235,6325,623,235 };
	int low = 0, high = sizeof(arr) / sizeof(int);
	MergeSort(arr, low, high - 1);
	for (int i = 0; i < high; i++)
	{
		printf("%d\n", arr[i]);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值