归并排序(Merge Sort)

归并排序是一种经典的排序算法,以其O(nlogn)的时间复杂度著称。本文详细介绍了如何使用C语言实现归并排序,包括针对int类型的数据以及C语言泛型的应用。
摘要由CSDN通过智能技术生成

归并排序(Merge Sort) C语言实现

​ 归并排序(mergesort)构思朴实而深刻,作为一个算法即古老又仍不失生命力。在排序算法的发展历史上,归并排序具有特殊的历史地位,它是第一个可以在最坏情况下依然保持**O(nlogn)**运行时间的确定性排序算法。

无序向量的递归分解+有序向量的逐层合并(二路归并算法)。

1. int 类型 mergesort
 // 对arr中的[lo, hi) 进行归并排序
void mergesort(int arr[], int lo, int hi)
{
   
	if(hi-lo<2) // 单元素自然有序
		return;
	int mi = (lo+hi)>>1; // 将arr均等分成两部分[lo, mi), [mi,hi)
	mergesort(arr, lo, mi); // 对arr[lo, mi) 进行排序
	mergesort(arr+mi, 0, hi-mi ); // 对arr[mi, hi) 进行排序
    merge(arr, lo, mi, hi); // 二路归并算法
}

 // 二路归并算法
void merge(int arr[], int lo, int mi, int hi)
{
   
	int * A= malloc(sizeof(int)*(mi-lo)); // 为了将排序好的arr返回,需要申请临时空间
	memcpy(A, arr, sizeof(int)*(mi-lo)); // 将arr前半部分复制到A中
	int * B= arr; // B亦指向arr中第一个元素的地址
	int i=lo, j=lo, k=mi; 
	while( j<mi || k<hi) // 循环条件
	{
   
		if((j<mi) && (!(k<hi) || A[j] <= B[k]))
		{
   
			arr[i++] = A[j++];
		}
		if((k<hi) && (!(i<mi) || A[j]> B[k]))
		{
   
			arr[i++] = B[k++];
		}
	}
	free(A);
}

/* 
		(!(k<hi) ||A[j] <B[k]) 等价于
		k==hi || k<hi && A[j] < B[k]  (短路法则)
		为了保证算法的正确性,在循环中应该满足
		k<=hi && j<mi;或者
		j<=mi && k<hi;或者
		j<mi && k<hi
		当满足k==hi && j==mi 时退出循环。
*/

2. C泛型实现
  1. mergesort.h
#pragma once
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值