JAVA编程----归并排序

article/2025/11/7 0:57:24

一、概念及其介绍

归并排序(Merge sort)是建立在归并操作上的一种有效、稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

二、适用说明

当有 n 个记录时,需进行 logn 轮归并排序,每一轮归并,其比较次数不超过 n,元素移动次数都是 n,因此,归并排序的时间复杂度为 O(nlogn)。归并排序时需要和待排序记录个数相等的存储空间,所以空间复杂度为 O(n)。

归并排序适用于数据量大,并且对稳定性有要求的场景。

三、过程图示

归并排序是递归算法的一个实例,这个算法中基本的操作是合并两个已排序的数组,取两个输入数组 A 和 B,一个输出数组 C,以及三个计数器 i、j、k,它们初始位置置于对应数组的开始端。

A[i] 和 B[j] 中较小者拷贝到 C 中的下一个位置,相关计数器向前推进一步。

当两个输入数组有一个用完时候,则将另外一个数组中剩余部分拷贝到 C 中。

自顶向下的归并排序,递归分组图示:

对第三行两个一组的数据进行归并排序

对第二行四个一组的数据进行归并排序

整体进行归并排序

四、参考代码

public class MergeSort {// 将arr[l...mid]和arr[mid+1...r]两部分进行归并private static void merge(Comparable[] arr, int l, int mid, int r) {Comparable[] aux = Arrays.copyOfRange(arr, l, r + 1);// 初始化,i指向左半部分的起始索引位置l;j指向右半部分起始索引位置mid+1int i = l, j = mid + 1;for (int k = l; k <= r; k++) {if (i > mid) {  // 如果左半部分元素已经全部处理完毕arr[k] = aux[j - l];j++;} else if (j > r) {   // 如果右半部分元素已经全部处理完毕arr[k] = aux[i - l];i++;} else if (aux[i - l].compareTo(aux[j - l]) < 0) {  // 左半部分所指元素 < 右半部分所指元素arr[k] = aux[i - l];i++;} else {  // 左半部分所指元素 >= 右半部分所指元素arr[k] = aux[j - l];j++;}}}// 递归使用归并排序,对arr[l...r]的范围进行排序private static void sort(Comparable[] arr, int l, int r) {if (l >= r) {return;}int mid = (l + r) / 2;sort(arr, l, mid);sort(arr, mid + 1, r);// 对于arr[mid] <= arr[mid+1]的情况,不进行merge// 对于近乎有序的数组非常有效,但是对于一般情况,有一定的性能损失if (arr[mid].compareTo(arr[mid + 1]) > 0)merge(arr, l, mid, r);}public static void sort(Comparable[] arr) {int n = arr.length;sort(arr, 0, n - 1);}// 测试MergeSortpublic static void main(String[] args) {int N = 1000;Integer[] arr = SortTestHelper.generateRandomArray(N, 0, 100000);sort(arr);//打印数组SortTestHelper.printArray(arr);}
}


http://chatgpt.dhexx.cn/article/ujuAK1LE.shtml

相关文章

归并排序java(内附超详解图文讲解)

目录 归并排序介绍: 归并排序图解&#xff1a; 示意图1 示意图2 归并排序详细步骤&#xff1a; 1.组合 2.分组 完整代码 归并排序介绍: 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法&#xff0c;该算法采用经典的分治(divide- and-conquer)策略(分治法将问题分…

java实现归并排序(详解)

主要思想 归并排序和快速排序都是基于分而治之的算法思想。 归并排序先将待排序的数组不断拆分&#xff0c;直到拆分到区间里只剩下一个元素的时候。不能再拆分的时候。这个时候我们再想办法合并两个有序的数组&#xff0c;得到长度更长的有序数组。当前合并好的有序数组为下…

Launcher3--抽屉

抽屉是用来放置安卓手机中所有需要显示到Launcher上的(当然也可以进行过滤&#xff0c;将不想显示的隐藏起来)应用和小部件&#xff0c;启动应用、添加快捷方式到桌面、卸载等。之前也提到过&#xff0c;有些Launcher是没有抽屉的&#xff0c;如MIUI的Launcher。在Launcher3中&…

Android launcher3 开发初始篇

版本&#xff1a;1.0 日期&#xff1a;2014.8.26 2014.8.27 2014.11.10 版权&#xff1a;© 2014 kince 转载注明出处 好久没有写博客&#xff0c;也是因为工作比较忙的关系。当然这不是理由&#xff0c;主要是很多bug要改&#xff0c;而自己的效率又不是很高&#xff0c;…

安卓Launcher 简介

转载请注明出处&#xff1a;安卓Launcher 简介_安卓launcher是什么_Mr_Leixiansheng的博客-CSDN博客 文章概述&#xff1a; 1.什么是Launcher 2.新建一个Launcher工程 3.Apps去哪了 4.显示桌面背景 最近换了新工作(๑ㅁ)&#xff0c;又是要去接触新的知识了。闲话不多说&…

android12.0(S) Launcher3 细节修改

去除 Launcher3 底部类似 dockbar 条目 packages/apps/Launcher3/src/com/android/launcher3/DeviceProfile.java availableHeightPx windowBounds.availableSize.y;mInfo info; - isTablet info.isTablet(windowBounds);//isTablet info.isTablet(windowBounds);is…

Launcher3

Android 4.4 (KK)开始Launcher默认使用Launcher3&#xff0c;Launcher3较Launcher2 UI 有部分调整&#xff0c;主要包括: &#xff08;1&#xff09; 状态栏透明&#xff0c;App List 透Wallpaper&#xff1b; &#xff08;2&#xff09; 增加overview模式&#xff0c;可以调整…

Launcher3 模块的简单设计

Launcher3 模块的简单设计 Lancher3 路劲&#xff1a; Z:\xxx\packages\apps\Launcher3 任务 1、AllApps背景透明化。 2、Allapps前3个图标变为Chrome、youtube、play商店。 3、长按桌面空白处在弹出的按钮下添加一个图标变大按钮&#xff0c;一个图标变小按钮&#xff0c;点…

android12.0(S) Launcher3 导入 AndroidStudio 调试编译

验证环境 aosp 12.0 源码&#xff0c;分支 android-12.0.0_r3 可以参考之前写的 android12.0(S) Pixel 3XL (QCOM 845) 编译刷机 AndroidStudio 版本 Android Studio Arctic Fox | 2020.3.1 Patch 4 gradle 版本 gradle-7.0.2-bin.zip gradle:7.0.4 二手 Pixel 3 XL一台可直…

launcher3的具体学习

目录结构&#xff1a; allapps 目录&#xff1a;主要存放主菜单界面相关代码。 anim目录&#xff1a;存放动画相关&#xff0c; badge目录&#xff1a;存放图标标识相关 compat目录&#xff1a;存放解决兼容性相关。 config目录&#xff1a;配置Launcher相关功能的宏开关 dragn…

Android10/11 原生Launcher3深度定制开发

一、引言 关于Android10和11系统Launcher3的定制有很多&#xff0c;根据项目的需求会进行各种定制开发&#xff0c; 于是就需要研究Launcher3的源码。本文主要从Android 11的Launcher3QuickStep着手 &#xff08;go版本或者其他版本类似&#xff09;从常用的修改进行分析&#…

Launcher3-桌面布局+主要的类+启动流程

一、launhcer3桌面布局二、launcher3主要的类LauncherModel&#xff1a;BubblTextView&#xff1a;DragController&#xff1a;LauncherAppState&#xff1a;DragView&#xff1a;DragSource&#xff0c;DropTarget&#xff1a;Folder&#xff1a;FolderIcon&#xff1a;Launch…

Launcher3--初识Launcher3

一、Launcher简介 Launcher时开机完成后第一个启动的应用&#xff0c;用来展示应用列表和快捷方式、小部件等。Launcher作为第一个(开机后第一个启动的应用)展示给用户的应用程序&#xff0c;其设计的好坏影响到用户的体验&#xff0c;甚至影响用户购机的判断。所以很多品牌厂商…

Android Launcher3分析及定制主题实现

一. Launcher3 简介 **launcher3是在Launcher2的基础上进化的版本,从Android 4.4 开始就使用Launcher3 .(kk版,kk2版)作为桌面使用,以前我们都在使用Launcher2,我们使用的是KK版本,具体区别后面再说. ** 1 Launcher3 桌面变成了动态管理,launcher2 里面默认最多加载五个worksp…

Android Launcher3简介

一.Launcher3概述 Launcher顾名思义&#xff0c;就是桌面的意思&#xff0c;也是android系统启动后第一个启动的应用程序&#xff0c;这里以android11为例&#xff0c;和其他应用并无区别&#xff0c;只是增加了对其他app和widget的管理窗口&#xff0c;且可以为用户定制化一些…

详细理解准确率、精准率、召回率,F1值等评价指标的含义

转载文章 原博客地址&#xff1a;详解准确率、精确率、召回率、F1值等评价指标的含义 机器学习问题之中&#xff0c;通常需要建立模型来解决具体问题&#xff0c;但对于模型的好坏&#xff0c;也就是模型的泛化能力&#xff0c;如何进行评估&#xff1f;我们可以定一些评价指标…

详解准确率、精确率、召回率、F1值等评价指标的含义

机器学习问题之中&#xff0c;通常需要建立模型来解决具体问题&#xff0c;但对于模型的好坏&#xff0c;也就是模型的泛化能力&#xff0c;如何进行评估呢&#xff1f; 很简单&#xff0c;我们可以定一些评价指标&#xff0c;来度量模型的优劣。比如准确率、精确率、召回率、…

分类性能评价指标——精确率,召回率,F1值详细解释

分类性能的评价指标 准确率 准确率是全部参与分类的文本中&#xff0c;与人工分类结果吻合的文本所占的比例。 即&#xff1a;预测与真实标签相同的比例 A c c u r a c y T P T N T P T N F P F N Accuracy\frac{TPTN}{TPTNFPFN} AccuracyTPTNFPFNTPTN​ 精确率 也称…

准确率、精确率、召回率、F1值

1.TP、TN、FP、FN 先粘一个官方形式的。 用新冠来举例理解。下方正方形为样本&#xff0c;其中 圆的部分认定为检测后是阳性的&#xff0c;其余部分为检测为阴性的&#xff08;但是现在的情况是检测并不完全准确&#xff0c;有可能检测时阴性&#xff0c;但实际上已经有新冠…

机器学习中的二分类问题评价指标之精确率、召回率、F1值通俗理解

引言&#xff1a;对于分类问题&#xff0c;我们在评估一个模型的好坏时&#xff0c;通常想到的是把该模型在测试集上分类结果正确的样本数量比上测试集的样本数量的比值结果&#xff0c;即准确率&#xff08;精确率&#xff09;作为评价准则。但除此之外&#xff0c;还有精确率…