归并(Merge)排序

前言

本篇文章记录了Python与C++的归并排序实现与讲解

以下是本篇文章正文内容,下面案例可供参考

一、什么是归并排序?

归并:把两个或多个已经有序的序列合并成一个序列。
2路归并:把2个有序序列合并成一个序列。
2路归并每选出一个元素需要对比1次关键字。
所以m路归并,每选出一个元素需要对比关键字m-1次。

二、算法思想

  1. 将一个无序的序列,建立一个指向表头的low指针,一个指向表尾的hight指针,mid=(low+hight)/2指针将序列从中间分开。
  2. 对左半部分[low,mid]递归的进行归并排序
  3. 对右半部分[mid+1,hight]递归的进行归并排序
  4. 将左右两个有序子序列Merge为一个有序序列。

三、动态演示

在这里插入图片描述

四、代码示例

4.1.C++代码示例


int n=10;										
int *B=(int *)malloc(n*sizeof(int));					// 建立一个辅助数组

//A[low..mid]和A[mid+1,hight]各自有序,将两个部分归并
void Merge(int A[],int low,int mid ,int hight){
	/************************************************* 
	Function:       // Merge
	Description:    // 合并,将多个有序序列合并成为一个
	Calls:          // None;
	Input:          // A[]-被排序数组  low-表头index,hight-表尾index,mid-切分成2个表
	Output:         // None
	Return:         // None 
	*************************************************/  
    int i,j,k;
    for(k=low;k<=hight;k++){							// 将A中所有元素复制到辅助数组B中
        B[k]=A[k];
    }
    for(i=low,j=mid+1,k=i;i<=mid&&j<=hight;k++){
        if (B[i]<=B[j]) 								/*** 将较小的值复制到数组A中
        {												这里是等于的原因,是保证算法稳定性
            A[k]=B[j++];								***/
        }
        else
        {
            A[k]=B[i++];
        }
    }
    while (i<=mid)										// 这里将剩余的有序序列复制到数组A
    {
        A[k++]=B[i++];
    }
    while (j<=hight)
    {
        A[k++]=B[j++];
    }
    
}

void MergeSort(int A[],int low,int hight){
	/************************************************* 
	Function:       // MergeSort
	Description:    // 归并排序
	Calls:          // MergeSort; Merge;
	Input:          // A[]-被排序数组 low-表头index,hight-表尾index,mid-切分成2个表
	Output:         // None
	Return:         // None 
	*************************************************/  
    if (low<hight){
        int mid = (low+hight)/2;						// 将表从中间划分
        MergeSort(A,low,mid);							// 对左表排序
        MergeSort(A,mid+1,hight);						// 对右表排序
        Merge(A,low,mid,hight);							// 归并
    }
}

4.2.Python代码示例

与C++一致,不再赘述。

五、性能分析

5.1 空间复杂度

空间复杂度= O ( n ) O(n) O(n),来自于辅助函数.

5.2 时间复杂度

5.2.1 最坏时间复杂度

建堆时间复杂度= O ( n ) O(n) O(n)
排序的时间复杂度= n l o g 2 n nlog_2n nlog2n,每趟归并时间复杂度为 O ( n ) O(n) O(n),n个元素进行2路归并排序,归并趟数= l o g 2 n log_2n log2n

5.3 稳定性

归并排序是一个稳定的排序算法

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值