当前位置: 首页 > news >正文

算法导论学习笔记——合并排序

/**
 * 采用递归方法实现排序,特点:复杂度O(nlgn),非原地排序(有非常数个元素存放在数组以外的地方)
 * 分解:将n个元素分成各含n/2个元素的子序列
 * 解决:用合并排序法对两个子序列递归地排序
 * 合并:合并两个已排序好的子序列以得到排序结果
 */
public class MergeSort {

    /**
     * 合并两个已排序的子序列
     * @param arr 数组
     * @param p 数组arr中从p到q为已排序的子序列一,共q-p+1个元素
     * @param q 数组arr中从q+1到r为已排序的子序列二,共r-q个元素
     * @param r
     */
    public void merge(int arr[],int p,int q,int r){
        int n1=q-p+1;
        int n2=r-q;
        //由于这里创建了两个数组来存放两个子序列的元素,所以为非原地排序
        int tem1[] = new int[n1];
        int tem2[] = new int[n2];
        for(int i  = 0;i<n1;i++)
            tem1[i]=arr[p+i];
        for(int j=0;j<n2;j++)
            tem2[j]=arr[q+j+1];
        int i = 0;
        int j = 0;
        int k = p;
        for(;i<n1&&j<n2;){
            if(tem1[i]<tem2[j])
                arr[k++]=tem1[i++];
            else
                arr[k++]=tem2[j++];
        }
        //把剩余的元素放入arr中
        while(i<n1)
            arr[k++]=tem1[i++];
        while(j<n2)
            arr[k++]=tem2[j++];
        
    }
    /**
     * 合并排序算法的外层调用函数,
     * 把n个元素分成各含n/2个元素的子序列,然后递归进行分解,分解到两个子序列只有一个元素时调用merge进行合并
     * @param arr  数组
     * @param p   开始位置
     * @param r  结束位置
     */
    void mergeSort(int arr[],int p,int r){
        if(p<r){
            int q= (p+r)/2;
            mergeSort(arr,p,q);
            mergeSort(arr,q+1,r);
            
            merge(arr,p,q,r);
        }
    }
    
    public static void main(String[] args) {
        int arr[] = {3,4,5,14,19,11,16,1,9,7,8,10,2,6,12,15,18,13,17,20};
        MergeSort ms = new MergeSort();
        ms.mergeSort(arr,0,arr.length-1);
        for(int i=0;i<arr.length;i++)
            System.out.println(arr[i]);
    }
}


相关文章:

  • 算法导论学习笔记——最大优先级队列
  • Data.xml文件找不到的解决
  • 算法导论学习笔记——快速排序算法
  • instancetype
  • CentOS下SVN使用
  • java虚拟机学习笔记——java安全模型
  • 《C++ Primer Plus(第六版)》(9)(第七章 函数 笔记和答案)
  • 算法导论学习笔记——计数排序算法
  • 本地化资源文件关键字重复的报错解决。
  • 数字签名是什么?
  • 探索推荐引擎内部的秘密:推荐引擎初探
  • 决策树
  • 算法导论学习笔记——基数排序
  • 算法导论学习笔记——桶排序
  • [java]删除数组中的某一个元素
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • Java读取Properties文件的六种方法
  • js正则,这点儿就够用了
  • Spark学习笔记之相关记录
  • V4L2视频输入框架概述
  • 从0到1:PostCSS 插件开发最佳实践
  • ------- 计算机网络基础
  • 三分钟教你同步 Visual Studio Code 设置
  • 微信开源mars源码分析1—上层samples分析
  • 微信小程序设置上一页数据
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 找一份好的前端工作,起点很重要
  • ionic异常记录
  • #android不同版本废弃api,新api。
  • #DBA杂记1
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (Java)【深基9.例1】选举学生会
  • (分类)KNN算法- 参数调优
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (原)本想说脏话,奈何已放下
  • (转)fock函数详解
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)关于多人操作数据的处理策略
  • ***检测工具之RKHunter AIDE
  • *p++,*(p++),*++p,(*p)++区别?
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .net Signalr 使用笔记
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .net6Api后台+uniapp导出Excel
  • .NET关于 跳过SSL中遇到的问题
  • .NET命令行(CLI)常用命令
  • .NET项目中存在多个web.config文件时的加载顺序
  • @property python知乎_Python3基础之:property