Java各种排序

快速排序

我们会以最左边的元素作为标准,

从高位取值和他比较,找到高位比他小的元素和low互换,如果比他大则坐标减一继续找

从低位取值找到比他大的元素,和high互换填补到high的位置,如果比他小则继续找

直到low = high循环结束,此时low或者high的坐标就是standard的坐标,返回之后继续递归

public static int parition(int[] arr, int low, int high) {int standard = arr[low];while (high > low) {while (high > low && arr[high] >= standard) {high--;}arr[low] = arr[high];while (high > low && arr[low] <= standard) {low++;}arr[high] = arr[low];}arr[low] = standard;return low;
}
这里需要注意:必须要检查from要小于等于end
public static void quickSort(int[] arr, int from, int end) {if (arr.length <= 1 || from >= end) {return;}int partition = parition(arr, from, end);quickSort(arr, from, partition - 1);quickSort(arr, partition + 1, end);
}

归并排序

主体思想是先把数组分为不可分的整体每个整体看作一个数组,然后数组合并排序然后再合并最终变成一整个排序好的数组。但是直接这样可能不太好理解。

可以先用二分的方式把数组分成两个部分,然后再二分,直到不可分,然后merge

public static void mergeSort(int[] arr) {if (arr.length < 2) {return;}dichotomy(arr, 0, arr.length - 1);
}
public static void dichotomy(int[] arr, int low, int high) {if (high <= low) {return;}int mid = low + (high - low) / 2;// 继续二分dichotomy(arr, low, mid);dichotomy(arr, mid + 1, high);merge(arr, low, mid, high);
}

当有任意一方到头了,则另一方全部灌入目标数组

public static void merge(int[] arr, int low, int mid, int high) {int leftIndex = low;int rightIndex = mid + 1;int[] result = new int[high - low + 1];for(int i = 0; i < result.length; i++) {// 两边都还没到头则互相比较if (leftIndex <= mid && rightIndex <= high) {if (arr[leftIndex] <= arr[rightIndex]) {result[i] = arr[leftIndex];leftIndex++;} else {result[i] = arr[rightIndex];rightIndex++;}} else if (leftIndex <= mid) {// 右边到头了result[i] = arr[leftIndex];leftIndex++;} else {// 左边到头了result[i] = arr[rightIndex];rightIndex++;}}
// 目标数组归入原数组for(int i = 0; i < result.length;i++) {arr[i + low] = result[i];}
}

堆排序

通过大根堆的性质,把最大值放到堆顶,然后和数组最后一位互换,堆长度--

整个过程堆长度要始终传入。

数组元素i的左右堆元素分别为 2*i + 1,2*i+2

数组最大非叶子节点为(length - 2)/2

public static void heapsort(int[] arr) {if (arr.length < 2) {return;}int heapLen = arr.length;for (int i = arr.length - 1; i > 0; i--) {findBiggestHeap(arr, heapLen);// 此时和大根堆的0位置互换swap(arr, 0, i);heapLen--;}
}
public static void findBiggestHeap(int[] arr, int heapLen) {int notLeafNode = (heapLen - 2) / 2;int leftNode, rightMode;for(int i = notLeafNode; i >= 0;i--) {leftNode = i*2 + 1;rightMode = leftNode + 1;leftRightCompare(arr, leftNode, rightMode, heapLen, i);}
}
public static void downAdjust(int[] arr, int i, int heapLen) {int leftNode = i*2 + 1;int rightMode = leftNode + 1;leftRightCompare(arr, leftNode, rightMode, heapLen, i);
}
public static void leftRightCompare(int[] arr, int leftNode, int rightMode, int heapLen, int i) {if (rightMode < heapLen) {// 有两个节点if (arr[leftNode] > arr[i] && arr[leftNode] >= arr[rightMode]) {// 左节点最大swap(arr, leftNode, i);// i节点下放之后还得处理downAdjust(arr, leftNode, heapLen);} else if (arr[rightMode] > arr[i] && arr[rightMode] > arr[leftNode]) {// 右节点最大swap(arr, rightMode, i);// i节点下放之后还得处理downAdjust(arr, rightMode, heapLen);}} else if (leftNode < heapLen) {// 仅有左边的节点if (arr[leftNode] > arr[i]) {swap(arr, leftNode, i);// i节点下放之后还得处理downAdjust(arr, leftNode, heapLen);}}
}

半插入排序

我的半插入排序习惯从第三位开始排序,即默认前两个位置已经有序

public static void dInsertSort(int[] arr) {if (arr.length < 2) {return;}if(arr[0] > arr[1]) {swap(arr, 0, 1);}int mid, low, high, tmp;for(int i = 2; i < arr.length; i++) {if (arr[i] >= arr[i-1]) {continue;}low = 0;high = i;mid = low + (high - low)/2;while (high >= low) {if (arr[i] > arr[mid]) {low = mid + 1;} else {high = mid - 1;}mid = low + (high - low)/2;}// 当low比high要大的时候// 移动数组,1,4,5,3 => 1,4,4,5tmp = arr[i];moveArr(arr, low, i);// 1,4,4,5 -> 1,3,4,5arr[low] = tmp;}
}
public static void moveArr(int[] arr, int low, int to) {for(int i = to; i > low; i--) {arr[i] = arr[i - 1];}
}

桶排序

希尔排序

public static void shell(int[] arr) {int gap = arr.length >> 1;while (gap >= 1) {shell1(arr, gap);if(gap == 1) {break;}gap = gap >> 1;}
}
public static void shell1(int[] arr, int gap) {for(int i = 0; i < gap; i++) {isGap(arr, gap);}
}
public static void isGap(int[] arr, int gap) {for(int i = gap; i < arr.length; i += gap) {for(int j = i; j > 0; j -= gap) {if(arr[j - gap] > arr[j]) {swap(arr, j - gap, j);}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/63715.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MMN模型:服务率,到达率计算公式

MMN模型:服务率,到达率计算公式 即多服务窗排队模型M/M/N,是一种用于分析多个服务窗口(服务员)排队系统的数学模型。在这个模型中,“M”代表顾客到达时间间隔和服务时间均服从指数分布,这是排队论中常用的两种分布类型,用于描述随机事件发生的概率。具体来说,第一个“…

9. Win11上原生运行Ubuntu

本文介绍如何在win11原生系统上运行ubuntu&#xff0c;不需要额外安装虚拟机&#xff0c;以及如何配置网络等。 1.安装正版Win11 由于正版Win11需要钱&#xff0c;网上能破解的win11可能有问题&#xff0c;但是它们的破解工具&#xff0c;却是能正常用的&#xff0c;所以&…

【菜笔cf刷题日常-1800】D. Fun with Integers(数学)

链接&#xff1a;https://codeforces.com/problemset/problem/1062/D 题意&#xff1a;给你一个大于或等于 2 的正整数 n 。对于每一对整数 a 和 b ( 2≤|a|,|b|≤n )&#xff0c;当且仅当存在一个整数 x 使得 1<|x| 和 ( a⋅xb 或 b⋅xa )&#xff0c;其中 |x| 表示 x 的绝…

【CSS in Depth 2 精译_075】12.2 Web 字体简介 + 12.3 谷歌字体的用法

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第四部分 视觉增强技术 ✔️【第 12 章 CSS 排版与间距】 ✔️ 12.1 间距设置 12.1.1 使用 em 还是 px12.1.2 对行高的深入思考12.1.3 行内元素的间距设置 12.2 Web 字体 ✔️12.3 谷歌字体 ✔️12.…

【学习笔记】目前市面中手持激光雷达设备及参数汇总

手持激光雷达设备介绍 手持激光雷达设备是一种利用激光时间飞行原理来测量物体距离并构建三维模型的便携式高科技产品。它通过发射激光束并分析反射回来的激光信号&#xff0c;能够精确地获取物体的三维结构信息。这种设备以其高精度、适应各种光照环境的能力和便携性&#xf…

Python+OpenCV系列:图像的运算

文章目录 PythonOpenCV系列&#xff1a;图像的加权和、覆盖1. 图像加权和&#xff08;加权融合&#xff09;2. 图像覆盖&#xff08;区域叠加&#xff09;3. 应用场景4. 总结 PythonOpenCV系列&#xff1a;图像的加权和、覆盖 在图像处理中&#xff0c;图像的加权和与覆盖是两…

SQL汇总数据:聚集函数

我们经常需要汇总数据而无需实际检索出这些数据&#xff0c;为此SQL提供了专门的函数。使用这些函数&#xff0c;SQL查询能够高效地检索数据&#xff0c;以便进行分析和报表生成。这类检索的例子包括&#xff1a; 确定表中行数&#xff08;或者满足某个条件或包含某个特定值的…

Midjourney基础教程-功能界面详解

基础入门教程&#xff1a; 一.Midjourney快速入门(3步画出你的第一张图&#xff09; 注&#xff1a; 1.平台为大家设置了自动翻译&#xff0c;可以直接写中文提示词&#xff0c;自动翻译成英文。当然要求更准确&#xff0c;大家可以先翻译成英 文在输入进来。 2.提示词如何去…

AWS云计算问答式知识库系统的实现

AWS平台上建立一个生成式人工智能专业文文档问答式网站&#xff0c;前端用Flask框架&#xff0c;后端用Fast API&#xff0c;前端调用后端的唯一API来完成大模型文档搜索的功能&#xff0c;使用AWS Bedrock里的Titan和Llama3模型&#xff0c;以及OpenAI 4.0 API来调用模型并提供…

初识Linux · 日志编写

目录 前言&#xff1a; 日志的简单说明 编写日志 前言&#xff1a; 在线程池部分我们纵观全文&#xff0c;可以发现全文有很多很多的IO流&#xff0c;看起来还是差点意思的&#xff0c;而我们今天提到的日志&#xff0c;是在今后的代码编写中会经常接触&#xff0c;或者说在…

微信小程序做电子签名功能

文章目录 最近需求要做就记录一下。 人狠话不多&#xff0c;直接上功能&#xff1a; 直接搂代码吧,复制过去就可以用&#xff0c;有其他需求自己改吧改吧。 signature.wxml <!-- 电子签名页面 --> <custom-navbar title"电子签名"show-home"{{fals…

【HarmonyOS】使用AVPlayer播放音乐,导致系统其它应用音乐播放暂停 - 播放音频焦点管理

【HarmonyOS】使用AVPlayer播放音乐&#xff0c;导致系统其它应用音乐播放暂停 - 播放音频焦点管理 一、前言 在鸿蒙系统中&#xff0c;对于音乐播放分为几种场景。音乐&#xff0c;电影&#xff0c;音效&#xff0c;闹钟等。当使用AVPlayer播放音乐时&#xff0c;如果不处理…

API接口安全:保障电商数据不被泄露的关键

在当今的数字化时代&#xff0c;电子商务&#xff08;电商&#xff09;已成为全球商业活动的重要组成部分。随着电商平台的日益增多和用户数据的海量积累&#xff0c;数据安全问题也日益凸显。API&#xff08;应用程序编程接口&#xff09;作为电商平台与外部系统交互的桥梁&am…

金融机构远程办公面临的安全挑战

当前&#xff0c;金融机构的业务模式、IT架构都发生了深刻变化。在建设远程办公系统时&#xff0c;金融机构需要面对以下几个方面的挑战&#xff1a; 如何实现“边界模糊化”网络环境下的安全接入&#xff1f; 随着金融机构基础设施云化、业务互联网化和办公移动化&#xff0…

Linux中inode、软硬连接

磁盘的空间管理 如何对磁盘空间进行管理&#xff1f; 假设在一块大小为500G的磁盘中&#xff0c;500*1024*1024524288000KB。在磁盘中&#xff0c;扇区是磁盘的基本单位&#xff08;一般大小为512byte&#xff09;&#xff0c;而文件系统访问磁盘的基本单位是4KB&#xff0c;因…

基于卷积神经网络的垃圾分类系统实现(GUI应用)

1.摘要 本文主要实现了一个卷积神经网络模型进行垃圾图像分类&#xff0c;为了提高垃圾分类模型的准确率&#xff0c;使用使用Batch Normalization层、使用早期停止策略来防止过拟合等方法来优化模型&#xff0c;实验结果显示最终优化后的模型准确率较高90%左右。最终&#xf…

IDEA结合GitLab使用

GitLab新建仓库 使用管理员账号创建gitlab仓库创建空白文件填写项目名称及命名空间 注意&#xff1a;取消勾选【使用自述文件初始化仓库】&#xff0c;否则IDEA中push代码报错 设置仓库权限 【设置】-【仓库】-【受保护分支】中需要添加哪些角色可以提交与合并代码&#xff0…

apisix lua插件开发记录

1 如何匹配路径中的参数 文章给出了具体的方法&#xff0c;但有隐藏的坑未提及。 router radixtree_uri_with_parameter 启用后&#xff0c;对路径上的参数名有要求&#xff0c;不能有_。否则会提示404&#xff0c;因为 router radixtree_uri_with_parameter解析不了。 2 插…

洛谷 P1179 [NOIP2010 普及组] 数字统计 C语言

题目&#xff1a; https://www.luogu.com.cn/problem/P1179 思路&#xff1a;直接暴力过 代码&#xff1a; #include<iostream> using namespace std; int cnt(int x) {int sum 0;while(x){int temp x %10;if(temp 2){sum;}x x/10;}return sum; } int main(void) …

Android APP自学笔记

摘抄于大学期间记录在QQ空间的一篇自学笔记&#xff0c;当前清理空间&#xff0c;本来想直接删除掉的&#xff0c;但是感觉有些舍不得&#xff0c;因此先搬移过来。 Android导入已有外部数据库 2015.06.26在QQ空间记录&#xff1a;在Android中不能直接打开res aw目录中的数据…