首页 > 编程语言 >算法学习笔记七一归并排序

算法学习笔记七一归并排序

时间:2023-12-27 22:25:21浏览次数:31  
标签:归并 辅助 七一 合并 算法 数组 排序

目录

什么是归并排序

归并排序(Merge Sort)是一种经典的排序算法,它采用分治策略来将一个大问题分解成小问题,然后将小问题的结果合并起来得到最终的解决方案。归并排序的核心思想是将待排序的数组不断地二分,直到每个子数组的长度为1,然后再将相邻的子数组合并成一个有序的数组(合并的连两个子数组各自应该是有序的),最终得到完全有序的数组。算法平均时间复杂度为O(nlogn)。

算法思想

归并排序的具体过程可以分为两个主要步骤:分解(Divide)和合并(Merge)。

  1. 分解(Divide):

    首先,将待排序的数组递归地二分为两个子数组,直到每个子数组的长度为1。这里使用递归的方式将数组一分为二,直到无法再分解为止。

  2. 合并(Merge):

    将相邻的两个子数组合并成一个有序的数组。这里使用一个辅助数组来存储合并后的结果。
    从两个子数组的起始位置开始,依次比较两个子数组中的元素大小,将较小的元素放入辅助数组中,并将相应的指针向后移动。
    当其中一个子数组的所有元素都放入辅助数组后,将另一个子数组中剩余的元素直接放入辅助数组中。
    最后,将辅助数组中的元素复制回原始数组的相应位置,完成合并过程。

代码示例

def merge(li, low, mid, high):
    i = low
    j = mid + 1
    merge_list = []
    while i <= mid and j <= high:
        if li[i] < li[j]:
            merge_list.append(li[i])
            i += 1
        if li[i] > li[j]:
            merge_list.append(li[j])
            j += 1
    while i <= mid:
        merge_list.append(li[i])
        i += 1
    while j <= high:
        merge_list.append(li[j])
        j += 1
    li[low:high+1] = merge_list


def merge_sort(li, low, high):
    if low < high: # 递归实现
        mid = (low+high) // 2
        merge_sort(li, low, mid)
        merge_sort(li, mid+1, high)
        merge(li, low, mid, high)
        # print(li[low:high+1])

标签:归并,辅助,七一,合并,算法,数组,排序
From: https://www.cnblogs.com/chase-youth/p/17931552.html

相关文章

  • 插入排序
    #include<bits/stdc++.h>usingnamespacestd;inta[10005];intmain(){ intn; cin>>n; srand(time(0));//随机数发生器 for(inti=1;i<=n;i++) a[i]=rand()%100;//产生0--99的随机数 for(inti=1;i<=n-1;i++) ......
  • 简单选择排序
    定义:对n个元素进行简单选择排序的基本方法是:第一趟从第1个元素开始,在n个元素中选出最小者,将其交换至第1个位置;第二趟从第2个元素开始,在剩下的n-1个元素中选出最小者,将其交换至第2个位置,以此类推,第i趟从n-i+1个元素中选出最小元素,将其交换至第i个位置,通过n-1趟选择,最终得到非递减排......
  • 算法学习笔记六一堆排序
    目录什么是堆排序算法思想代码示例什么是堆排序堆排序(HeapSort)是一种基于二叉堆数据结构的排序算法。它的主要思想是将待排序的序列构建成一个大顶堆(或小顶堆),然后反复从堆顶取出最大(或最小)元素,将剩余的元素重新调整为一个新的堆,再重复取出堆顶元素的过程,直到排序完成。算法思......
  • 堆排序
    步骤1.将数组构建成二叉树,n的左右孩子是2n+1、2n+2.2.将二叉树转化成堆(父节点大于等于两个孩子节点(大顶堆),父节点小于等于两个孩子节点(小顶堆)),时间复杂度O(n)。3.将堆顶和最后一个元素交换(此时堆顶就是最大值),事件复杂度O(logn)。4.按需要最大的n个值来执行(n-1)次步骤3。(时......
  • Mysql根据字段值的长度查找过滤,排序等
    Mysql根据字段值的长度查找过滤,排序等http://www.shanhubei.com/archives/5882.html1.Mysql根据字段的指定长度搜索过滤SELECT*FROMuserWHEREis_deleted=0ANDlength(name)>52.添加普通索引ALTERTABLE'table_name'ADDINDEXindex_name('column')3.在表中某一列......
  • 八大排序
    算法思想:每次生成一个样本用不同的排序测试并记录所用时间,一共十个样本,最后输出结果。主要/核心函数分析:堆排序:将带排序的序列构造成一个大顶堆,根据大顶堆的性质,当前堆的根节点(堆顶)就是序列中最大的元素,将堆顶元素和最后一个元素交换,然后将剩下的节点重新构造成一个大顶堆。归并......
  • 【归并排序】之C++实现
    描述归并排序是一种经典的排序算法,采用分治的思想。归并排序是一种基于分治思想的经典排序算法。它将待排序的数组不断地分成两个子数组,直到每个子数组只有一个元素。然后,对每个子数组进行归并排序,即不断地将两个有序的子数组合并成一个有序的数组。最终,所有子数组都合并成一个有......
  • T397291 【模板】拓扑排序(加强版)
    原题链接思路找到所有入度为零的点,然后消除其子节点的入度,再把入度为零的点塞入队列中为什么可以这么做呢?一个点能弹出队列,其父节点一定比他先入队,以此类推。。代码#include<bits/stdc++.h>usingnamespacestd;vector<int>G[100005];intin[100005]={0};intmain(){......
  • 按不同列排序
    问题:数据源三列,返回第一、二列按数据源第二列降序排序显示第一、二列; 第三、四列按数据源第三列降序排序显示第一、三列。函数公式解决:=CHOOSECOLS(SORT($A2:$C27,COLUMN(D1)/2,-1),IF(MOD(COLUMN(A1),2),1,COLUMN(C1)/2))Sort部分第一参数是数据源,第三参数-1表示降序排序。第二参......
  • Integer数组与int数组排序对比
    使用Arrays.sort的方法发现int数组和Integer数组的sort方法有区别Integer[]arr={1,2,3};int[]arr1={1,2,3};Arrays.sort(arr1);Arrays.sort(arr,newComparator<Integer>(){@Overridepublicintcompar......