首页 > 其他分享 >归并排序(Merge_sort)

归并排序(Merge_sort)

时间:2024-06-10 14:05:16浏览次数:20  
标签:sort 归并 int hight mid Merge low 数组

归并排序:

归并的意思是将两个数组合成为一个,而归并排序就是:将一个数组分为许多个,让多个数组按大小归并,直到归并为一个;

基本思想为:

将一个数组拆分为许多个两两结合的数组,然后逐步排序

主要函数是将两个分开的数组排序成一个数组,需要两个指针指向两个数组开头,每次排列进去最小的数字;

需要递归函数和归并函数

递归函数:

void Merge_sort(int *a,int low,int hight)
{
    if(low < hight)
    {
        int mid = (low+hight)/2;
        Merge_sort(a,low,mid);
        Merge_sort(a,mid+1,hight);
        Merge(a,low,hight,mid);
    }
}

递归结束条件是low < hight,也就是最小为2的数组,而如果数组总长度小于1就会不做任何排序

递归函数的作用是将数组按顺序拆分为两个两个的好多对数字,

然后将这两个数字看作一个数组,和另一对数组排序(两个指针指向两个数组开头,每次排列进去最小的数字);

归并函数:

int Merge(int *a,int low,int hight,int mid)
{
    //利用b来给a赋值
    int b[hight+1];
    int i,j,k = low;
    //初始化b
    for(i = 0;i < hight+1;++i)
    {
        b[i] = a[i];
    }
    //将两个有序数组排列为一个
    for(i = low,j = mid+1;i <= mid && j <=hight;++k)
    {
        if(b[i] > b[j])
        {
            a[k] = b[j];
            ++j;
        }
        else
        {
            a[k] = b[i];
            ++i;
        }
    }
    //可能有剩余
    while(i <= mid)
    {
        a[k++] = b[i++];
    }
    while(j <= mid)
    {
        a[k++] = b[j++];
    }
}

 可以看到这里是用新建数组的方法对两个数组按大小进行归并;

两个排序完后排序四个的,逐步递归,直到完成最开头的Merge函数,排序结束

c++代码如下:

#include <bits/stdc++.h>

using namespace std;

int Merge(int *a,int low,int hight,int mid)
{
    //利用b来给a赋值
    int b[hight+1];
    int i,j,k = low;
    //初始化b
    for(i = 0;i < hight+1;++i)
    {
        b[i] = a[i];
    }
    //将两个有序数组排列为一个
    for(i = low,j = mid+1;i <= mid && j <=hight;++k)
    {
        if(b[i] > b[j])
        {
            a[k] = b[j];
            ++j;
        }
        else
        {
            a[k] = b[i];
            ++i;
        }
    }
    //可能有剩余
    while(i <= mid)
    {
        a[k++] = b[i++];
    }
    while(j <= mid)
    {
        a[k++] = b[j++];
    }
}

void Merge_sort(int *a,int low,int hight)
{
    if(low < hight)
    {
        int mid = (low+hight)/2;
        Merge_sort(a,low,mid);
        Merge_sort(a,mid+1,hight);
        Merge(a,low,hight,mid);//将两个有序数组进行归并
    }
}

void print_arr(int *arr,int size)
{
    for(int i = 0;i < size;++i)
    {
        cout << arr[i];
        if(i != size-1)
        {
            cout << " ";
        }
    }
}

int main()
{
    int n;
    cin >> n;
    int arr[n];
    for(int i = 0;i < n;++i)
    {
        cin >> arr[i];
    }
    Merge_sort(arr,0,n);
    print_arr(arr,n);
    cout << endl;
}

标签:sort,归并,int,hight,mid,Merge,low,数组
From: https://blog.csdn.net/2301_76783671/article/details/139564879

相关文章

  • 宝藏速成秘籍(6)归并排序法
    一、前言1.1、概念    归并排序(MergeSort)是一种基于分治思想的排序算法。它将数组分成两个子数组,分别对这两个子数组进行排序,然后再将它们合并成一个有序的数组。归并排序是一种经典的分治算法,它的核心思想是将待排序的序列逐步划分成更小的子序列,然后将这些子序列......
  • 数据结构与算法之归并排序,以及它的代码实现与事例
    目录前言定义策略代码实现结果结束语前言今天是坚持写博客的第22天,我们来看看数据结构与算法当中的归并排序。定义首先我们来看看什么是归并排序?归并排序(MergeSort)是一种分治思想的排序算法。它将待排序的数组分成若干个子数组,每个子数组都是有序的,然后再将有序......
  • WPF CollectionViewSource.GetDefaultView ICollectionViewLiveShaping IsLiveSorting
    <Windowx:Class="WpfApp147.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft......
  • 8645 归并排序(非递归算法)
    Description用函数实现归并排序(非递归算法),并输出每趟排序的结果输入格式第一行:键盘输入待排序关键的个数n第二行:输入n个待排序关键字,用空格分隔数据输出格式每行输出每趟排序的结果,数据之间用一个空格分隔输入样例105480932671输出样例4508392......
  • CF1730F Almost Sorted
    CF1730FAlmostSorted状压dp题目的描述有点奇怪,实际上就是将\(p\)在满足要求的情况下重排列,求下标的逆序对最小值。根据条件,我们猜测前面的数都不会很大,于是考虑从左到右插入值,若当前插入的值为\(a_i\),那么由限制条件可知,前面放的数都\(\lea_i+k\),同时\(\lea_i\)的部......
  • Pandas碎碎念1 - Dataframe 合并之 join,concat,merge,append
    最近做的几个项目都要经常使用pandas操作excel,中间也遇到了不少坑,简单记录一下吧。套用骁哥的一句话,让自己变得更强!Pandas中有几种常见的合并dataframe的方法,join,concat,merge,append。下面来尝试一下:首先来做一些测试数据data1={'Src':[1,2,3,4],'Mid'......
  • 数据结构学习笔记-归并排序
    归并排序算法的设计与分析问题描述:设计并分析归并排序算法【算法设计思想】分割(Divide):从中间分割数组,使每个子数组包含一半的元素。这通过计算中点m来完成,通常是(l+r)/2,但为了防止大数溢出,使用l+(r-l)/2。解决(Conquer):递归地对两个子数组应用归并排序,直到......
  • python内置函数——sorted
    对List、Dict进行排序,Python提供了两个方法对给定的ListL进行排序,方法1.用List的成员函数sort进行排序,在本地进行排序,不返回副本方法2.用built-in函数sorted进行排序(从2.4开始),返回副本,原始输入不变--------------------------------sorted----------------------------------......
  • js table sort
    备份,后面做个整理letzoneOverviewData=[]letsortFields=[]constgetSortedRows=()=>{letrows=[...zoneOverviewData];constascFields=sortFields.filter((z)=>z.sort==="asc").sort((a,b)=>(a.sortIndex>b.sor......
  • 数组迭代方法和归并方法总结
    一、迭代方法(对数组每一项都运行)每个方法接受两个参数(以每一项为参数运行的函数,作为函数运行上下文的作用域对象(可选))传给每个方法的函数接收三个参数(数组元素,元素索引,数组本身)1.filter():函数返回true的项会组成数组后返回。(过滤函数,将数组中满足条件的项组成新数组后返回)。2.......