归并排序-java语言描述

6-98 归并排序(Java语言描述) 编程实现归并排序函数。public static void mergeSort(int arr[], int low, int high)。其中arr存放待排序的数据,数组长度不大于1000。 阅读详情

归并排序

求逆序数

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。

//将有序数组a[]和b[]合并到c[]中
void MemeryArray(int a[], int n, int b[], int m, int c[])
{
    int i, j, k;

    i = j = k = 0;
    while (i < n && j < m)
    {
        if (a[i] < b[j])
            c[k++] = a[i++];
        else
            c[k++] = b[j++]; 
    }

    while (i < n)
        c[k++] = a[i++];

    while (j < m)
        c[k++] = b[j++];
}

可以看出合并有序数列的效率是比较高的,可以达到O(n)。
解决了上面的合并有序数列问题,再来看归并排序,其的基本思路就是将数组分成二组A,B,如果这二组组内的数据都是有序的,那么就可以很方便的将这二组数据进行排序。如何让这二组组内数据有序了?
可以将A,B组各自再分成二组。依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了。这样通过先递归的分解数列,再合并数列就完成了归并排序。

public class GuiBingPaiXu {
    static int count;// 新增
    /*
     * 归并排序+逆序数
     * 
     * 与归并排序比较 增加了两行核心代码
     * 
     * 
     * 如果i<j而且 a[i]>a[j] 成为逆序数
     * 
     */

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // int[] a = { 26,5,77,1,61,11,59,15,48,19 };
        // int[] a={4,3,6,5,1,2};
        int[] a = { 2, 4, 3, 1 };
        sop(a);
        Guibing(a, 0, a.length - 1);
        sop(a);
        System.out.println(count);
    }

    public static void sop(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");
        }
        System.out.println();
    }

    public static void Guibing(int[] n, int first, int last) {

        if (first < last) {
            int mid = (first + last) / 2;
            // 左边
            Guibing(n, first, mid);
            // 右边
            Guibing(n, mid + 1, last);
            // 左右归并
            Mes(n, first, mid, last);
        }
    }

    public static void Mes(int[] a, int first, int mid, int last) {
        int[] temp = new int[a.length];
        int i = first;
        int j = mid + 1;
        int m = mid, n = last;
        int k = 0;
        // 把较小的数先移到新数组中
        while (i <= m && j <= n) {
            if (a[i] <= a[j]) {

                temp[k++] = a[i++];
            } else {
                temp[k++] = a[j++];
                count += mid - i + 1;// 逆序数 核心代码
            }

        }
        // 把左边剩余的数先移到新数组中
        while (i <= m) {
            temp[k++] = a[i++];
        }
        // 把右边剩余的数移到新数组中
        while (j <= m) {
            temp[k++] = a[j++];

        }
        // 把新数组中的元素 覆盖到 a数组中
        for (int p = 0; p < k; p++) {
            a[first + p] = temp[p];
        }
    }

}
归并排序(C++语言描述) 使用C++书写的归并排序算法,希望对各位有用。也请大牛指教代码中有何不足的地方! 立即下载

相关推荐

利用递归算法实现的归并排序的java程序

一个Java小程序,利用递归思想实现的归并排序算法。其中有两个类,排序数据是写死在main方法中的。

Java归并排序

归并排序(Merge Sort)是应用分治思想的一个典型例子。把一个待排序序列拆分为两个子序列,分别对两个子序列排序,子序列排序时也采用相同的方法,直至拆分后的两个子序列都是有序的,即长度为1的序列天然有序,这时停止拆分,将两个有序的子序列归并为一个更大的有序序列,与之前拆分时的路径相反,不断的归并有序子序列,最终归并为一个序列。这种将两个有序序列归并为一个有序序列的操作称为二路归并。

qq_38875964的博客 4058

Arm Neoverse CMN-700 SLC内存系统与缓存分区技术解析

现代处理器架构中,缓存一致性协议与内存子系统设计直接影响系统性能。Arm Neoverse CMN-700采用的SLC(System Level Cache)通过16-way组相联设计实现高效数据缓存,其物理地址索引机制支持灵活的way分区配置。在软件可配置内存(OCM)模式下,SLC可作为独立内存空间使用,通过寄存器控制实现模式切换与区域锁定。缓存分区技术则通过请求源分类和way-based分配策略,满足实时性任务与吞吐量场景的不同需求。这些技术在5G基站、边缘计算等低延迟场景中具有重要应用价值,特别是C

weixin_30263073的博客 623

归并排序 java语言实现

package sort; import java.util.Random; public class MergeSort { @SuppressWarnings("unused") public boolean initTestArray(int[] testArray) {// 初始化testArray if (testArray == null) return fals

weiqianghu的博客 846

基于AIS动态数据与AI结合得经纬度标示算法

港口船舶智能标注系统 本系统通过结合摄像头视频流和AIS船舶动态数据,利用AI技术实现船舶实时标注功能。系统架构包括视频流处理、AIS数据解析、船舶检测匹配和坐标映射转换等模块。关键技术步骤: AIS数据获取:通过本地接收机或网络API获取船舶位置、航速等信息 AI目标检测:采用YOLOv8等模型识别视频中的船舶 船舶匹配算法:通过位置投影或运动轨迹匹配视频目标与AIS数据 坐标映射:使用相机标定技术将经纬度转换为图像坐标 实时标注:在视频画面上叠加船名、位置等关键信息 应用场景包括港口监控、智能海事管理和

qianbo042311的博客 1811

YOLOv5s模型训练全流程解析:从数据准备到实战检测

本文详细解析了YOLOv5s模型训练的全流程,涵盖从环境搭建、数据准备与格式转换,到模型训练、参数调优及实战检测的完整步骤。文章提供了具体的代码示例和常见问题解决方案,旨在帮助开发者,特别是新手,高效掌握YOLOv5s模型训练的核心技术,并成功应用于实际检测任务中。

weixin_29041767的博客 335

归并排序(用Java语言内附讲解连接)

归并排序 (Java)   大一下学期学过半本数据结构,但可惜老师并没有讲过次内容,直到快大三的暑假,才抽时间去自学。 以下是自学后用java在IntelliJ IDEA中运行通过的代码,供读者参考 package 二零二零年暑假练习; import java.util.Arrays; import java.util.Scanner; public class Merge_Sort { public static void sort(int[] data,int start,int end){

~晨曦静竹~的博客 1108

Stata新手避坑:用reghdfe搞定行业、地区多重固定效应,告别‘共线性’报错

本文详细介绍了如何使用Stata中的reghdfe命令高效处理多重固定效应问题,解决传统方法在面板回归中遇到的共线性报错和低R²问题。通过实战案例和高级技巧,帮助新手快速掌握行业、地区等多维固定效应的控制方法,提升经济学和金融学研究的分析效率。

weixin_30635053的博客 422

归并排序(JAVA语言描述)

归并排序是与插入排序、冒泡排序、选择排序不同的另一类排序方法。归并的含义是将两个有序表合成一个新的有序的表。 归并排序的基本思想是,将待排记录r[0]到r[n-1]看作是一个含有n个长度为一的有序子表,把这些子表依次进行两两归并,得到[n/2]个有序的子表;然后再把[n/2]个有序子表进行两两归并,一直重复,最后得到一个长度为n的有序子表为止。 算法性能分析 (1)时间复杂度:归并排序的归并趟数为...

weixin_42417704的博客 213

SPI模式下的SD卡读写,为什么你的数据总出错?详解时序与状态机避坑指南

本文深入探讨SPI模式下SD卡读写数据出错的根本原因,提供时序优化与状态机设计的实战指南。针对时钟周期计数、状态机跳转和忙检测等核心问题,详解命令时序细节、状态机同步策略及高级避坑技巧,帮助开发者提升SD卡在SPI模式下的稳定性和性能。

weixin_30514745的博客 263

从零开始学习PX4源码20(遥控器模式切换如何执行)

本节主要学习PX4的手动遥控器切换模式,具体是如何实现的,具体改变了哪些变量,和模式管理有什么联系。

陌城烟雨 319

归并排序详解(Java语言描述 萌新向)

归并排序详解,简单易懂,喜欢就赶紧收藏吧~

分享点点滴滴的知识~ 1434

【局部规划模块轨迹优化算法】Teb_planner规划算法

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对****做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容由于ROS中的局部路径规划器比较老了,所以我推荐大家使用比较新的局部路径规划器teb_local_planner。teb_local_planner是基于弹性时间带碰撞约束的算法,算法将动态障碍物、运行时效、路径平滑性等约束做综合考虑,在复杂环境下有更优秀的表现。

qq_35635374的博客 953

数据结构与算法分析(Java语言描述)(5)—— 归并排序

伪代码split each element into partitions of size 1 recursively merge adjancent partitions for i = leftPartStartIndex to rightPartLastIndex inclusive if leftPartHeadValue <= rightPartHeadValue

HeatDeath的博客 746

传感器使用——ESP-WROOM-32 and INMP441麦克风音频采集

传感器使用——ESP-WROOM-32 and INMP441麦克风音频采集,数据显示及matlab操作界面。

qq_41958946的博客 7356

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

数据结构与算法分析(Java语言描述)(6)—— 归并排序(自底向上)

package com.algorithm.sort;import java.util.Arrays;public class MergeSortBU { private MergeSortBU(){} // 将arr[l...mid]和arr[mid+1...r]两部分进行归并 private static void merge(Integer[] arr, int l, i

HeatDeath的博客 685

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

(数据结构与算法分析 八)------插入排序,希尔排序,归并排序的实现( Java语言描述)

首先是插入排序,原理没什么好说的 package com.bird.seven; /** * 插入排序的实现 * @author Bird * */ public class InsertSort { public static void insertSort(int[] a){ int j; for(int i = 1; i < a.length; i++){ in

技术是我的毕生追求 1679

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

java语言描述数据结构与算法之——冒泡排序,插入排序,选择排序,希尔排序,快速排序,归并排序,二分查找

package com.demo.test; import java.util.Arrays; import java.util.Scanner; public class TestDemo{ public static void main(String[] args) { //随机输入n个数,存放在数组a中 Scanner scanner=new Sc...

yaoyaoyao_123的博客 759

归并排序

目录一、定义基本思想图解编程描述二、算法分析三、代码地址一、定义 基本思想 ​ 归并排序,其基本思想是合并2个已经排序的表,因为2个表已经排序,所以合并时,将数据放到第三个表中,则该算法可以通过对输入数据一样排序来完成。 基本的算法是取2个输入数组A和B,一个输出数组C。 3个计数器,Actr,Bctr,Cctr,他们初始置于对应数组的开始端。 A[Actr]和B[Bctr]中较小者拷贝到C中...

dhcao1112的博客 115

算法-排序算法:归并排序(Merge Sort)【O(nlogn)】【自顶向下:递归方式;自底向上:非递归方式】【稳定;最坏/最优时间复杂度:O(nlogn);空间复杂度:O(n)】

归并排序(Merge Sort):建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。 一、归并排序-算法描述: 把长度为n的输入序列分成两个长度为n/2的子序列; 对这两个子序列分别采用归并排序; 将两个排序好的子序列合并成一个最终的排序序列; 归并的过程无法原地完成; 二、归并排序-过程分析 每2组合并

u013250861的博客 975

(数据结构与算法分析 八)------插入排序,希尔排序,归并排序的实现( Java语言描述)...

首先是插入排序,原理没什么好说的 package com.bird.seven; /** * 插入排序的实现 * @author Bird * */ public class InsertSort { public static void insertSort(int[] a){ int j; for(int i = 1; i &lt; a.length; i++){ ...

huobengle 140

AI如何帮你10分钟实现归并排序?快马平台实战

整个过程从描述需求到获得可运行、可演示的完整项目,真的只用了不到10分钟,而且不需要手动配置任何开发环境。Python版本使用了递归实现,每个函数都配有中文注释,比如分解数组的split函数、合并两个有序数组的merge函数等。在平台的AI对话区,我直接用自然语言描述了需求:"请生成归并排序的Python和Java实现,要求包含详细注释、可视化页面、时间复杂度分析,并附带测试用例"。AI生成的时间复杂度分析非常专业,不仅解释了最好、最坏和平均情况下都是O(nlogn)的原因,还对比了与其他排序算法的优劣。

BlackironPanther23的博客 721

归并排序算法实现

算法简介 Merge sort,归并排序,是一种非常简单,有效的排序算法.这个算法的名称得于它的原理是将已经排序好的两个序列归并成一个序列.这是一个实现了分治法(devide and conquer)这个算法思想的一个很典型的应用. 分治法简单来说就是将一个原本很复杂的问题分割成为多个简单的子问题(devide),这样我们可以通过解决这些相对简单的小问题(conquer),来完成整个问题的处理

zimu666的专栏 1023
上一篇: 【蓝桥杯】密文搜索-java语言
下一篇: 代码与算法集锦-归并排序+树状数组+快排+深度优先搜索+01背包(动态规划)
Tenyearsme
博客等级 码龄11年 32粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值