首页 > 其他分享 >基础:归并排序

基础:归并排序

时间:2023-09-06 23:55:55浏览次数:29  
标签:origin 归并 end int 基础 mid start 排序

目录

简介

归并排序属于一种分治法,简单来说就是将一个大问题分解成若干类似大问题的子问题,然后分别解决,最后进行合并。

一般的分治法分为如下步骤:
1、分解:把一个问题分解成若干更小的类似的子问题
2、解决:递归解决子问题。当子问题足够小时,按照基础情况求解
3、合并:把子问题的解合并成原问题的解

那么将分治法应用于排序中,步骤如下:
若将一个含有n个元素的数组进行排序
1、分解:一个大问题是从1到n进行排序,那么我们将其分解,选取其中一段,从p到r进行排序。我们找到p与r的中点,反复分解。
2、解决:对p到q位置的数字进行上述递归排序,从q+1到r同理。当少于两个数字需要排序时,就会产生基础情况,因为一个数字显然是不用排序的。
3、合并:对从p到q的数列和q+1到r的数列进行合并。

代码与实操

经过上述分析,我们需要两个函数:分解函数与合并函数

分解

    if (start < end) {//如果start>= end 那这段数组至多有一个元素,那么无需排序
        int mid = (start + end) / 2;
        Mergesort (origin,start,mid);
        Mergesort (origin,mid + 1,end);
        Merge (origin,start,mid,end);
      
    }
}

合并

首先提供一下合并思路:
我们有一个数列a[p~r],我们将其分为两部分x[p~mid]y[mid+1~r]
ij分别取pmid+1
kpr依次取值
x[i] <= y[j]
a[k] = x[i],且i++
代码如下:

    int fir[10001] = {INT_MAX };
    int sec[10001] = {INT_MAX };
    for (int i = start; i <= mid; i++) {
        fir[i] = origin[i];
    }
    for (int i = mid + 1; i <= end; i++) {
        sec[i] = origin[i];
    }

    int n1 = start;
    int n2 = mid + 1;
    for (int k = start; k <= end; k++) {
        if ((n1<=mid&&fir[n1] <= sec[n2])||(n2>end)) {//这里的判定非常重要,要考虑到两边取完数的情况
            origin[k] = fir[n1];
            n1++;
        }
        else {
            origin[k] = sec[n2];
            n2++;
        }
    }
}

代码

#include <bits/stdc++.h>
using namespace std;
int a[1000001] = { };
int ans[10000001] = { };
int left = 0, right = 0;
int n = 0;
void Merge (int origin[],int start,int mid,int end) {
    int fir[10001] = {INT_MAX };
    int sec[10001] = {INT_MAX };
    for (int i = start; i <= mid; i++) {
        fir[i] = origin[i];
    }
    for (int i = mid + 1; i <= end; i++) {
        sec[i] = origin[i];
    }

    int n1 = start;
    int n2 = mid + 1;
    for (int k = start; k <= end; k++) {
        if ((n1<=mid&&fir[n1] <= sec[n2])||(n2>end)) {
            origin[k] = fir[n1];
            n1++;
        }
        else {
            origin[k] = sec[n2];
            n2++;
        }
    }
}
void Mergesort (int origin[],int start,int end){
    if (start < end) {
        int mid = (start + end) / 2;
        Mergesort (origin,start,mid);
        Mergesort (origin,mid + 1,end);
        Merge (origin,start,mid,end);
        
    }
}
int main () {
    scanf ("%d/n" ,&n);
    for (int i = 1;i <= n; i++) {
        cin >> a[i];
    }
    Mergesort(a,1,n);
    for (int i = 1;i <= n; i++) {
        printf ("%d " ,a[i]);
    }
    return 0;
}

标签:origin,归并,end,int,基础,mid,start,排序
From: https://www.cnblogs.com/Crazyman-W/p/17683682.html

相关文章

  • java基础-idea的使用-day07
    目录1.idea的获取2.已经安装的idea如何卸载3.idea的安装与破解3.设置4.写代码常用快捷建的使用1.idea的获取链接:https://pan.baidu.com/s/1x-WT04lbJ_1FXCP3kWcihg?pwd=ufjh提取码:ufjh2.已经安装的idea如何卸载对于免安装的idea:(1)删除安装文件(2)到用户下将idea的缓......
  • 虚拟化-基础学习
    虚拟化-基础学习虚拟化HypervisorHypervisor,又称虚拟机器监视器(英语:virtualmachinemonitor,缩写为VMM),是用来管理虚拟机运行的。运行虚拟机的电脑被称为宿主机,虚拟机称为客户机,各个客户机共享虚拟化后的硬件资源。Hypervisor又分为两类:type1虚拟机管理程序Hypervisor直接运......
  • Rust基础学习
    Rust基础学习Rust是一种适合于系统开发、网络层等开发的编程语言,具有高效、安全的特性。Cargo常用命令Cargo是Rust用来管理代码的工具。常用指令有:创建新项目:cargonewhello_cargo构建项目cargobuild构建+运行项目cargorun检查是否编译可以通过cargoch......
  • PyTorch基础知识
    PyTorchTutorialPython3中机器学习框架dataset=MyDataset(file)dataloader=DataLoader(dataset,batch_size=size,shuffle=True)Training:TrueTesting:Falsefromtorch.utils.dataimportDataset,DateLoaderclassMyDataset(Dataset):def__init__(self,......
  • 数据类型基础(8)
    解压缩#一次性取出多个值lis=[1,2,3]x1,x2,x3=lisprint(x1)print(x2)print(x3)#当我不需要2时 虽然可以打印出来,但是尽量不要打印x1,_,x3=lis#_表示不需要,约定俗称的#当我只要第3个元素print('*'*50)_,_,x3=lisprint(x3)#‘*’的作用*_会把前面所......
  • 数据类型基础(6)
    列表类型定义(容器类型),放多个数据类型,例如:↓e.glis=['nick','handsome'] gangpao_hobby_list=['dapao','piao','666'] nick_hobby_list=list(['read','music','run']) print(nick_hobby_lis......
  • 数据类型基础(5)
    字符串string定义:把字符串在一起定义方式name1=str('sun_da_pao')name2="xiao_gang_pao"word='xiao_gang_pao说了一句话:"万般皆下品惟有读书高"'三引号也可以换行word2='''xiao_gang_pao'说了一句话:"万般皆下品惟有读书高"'''pri......
  • 数据类型基础(4)
    布尔值定义:就是判断True(真)和False(假)一般只作为条件的结果出现,不能使用 ①能:print(bool(1==1))#结果为True print(bool(1==2))#结果为false ②不能:print(True) python中除了0/None/空(空字符/空列表/空字典)/False之外所有数据类型都自带布尔值为True......
  • 数据类型基础(3)
    字典i定义方式,{}内以逗号隔开,键值对:key(描述意义,一般使用字符串类型,不能使用列表和字典):value(值,任意数据类型)#哈希表 例如:|| ﹀gangpao_info_dict={'name':'gangpao','gender':'female','age':18,......
  • 数据类型基础(2)
    浮点型i定义方式salaary=3.2salaary2=float(3)print(salaary2)#结果为3.0 ii作用:描述薪水等 iii使用方法 +(加)-(减)*(乘)/(除)%(取余)//(取整)*(幂)③列表类型(容器类型),放多个数据类型建议:以后定义变量要在后面+下划线+类型如:angpao_hobby_list=[‘dapao’,’piao’,’666’]i使用方法......