插入、希尔、归并、快速排序(java实现)
目录
插入排序
希尔排序
归并排序
快速排序
插入排序
排序原理:
1.把所有元素分为两组,第一组是有序已经排好的,第二组是乱序未排序。
2.将未排序一组的第一个元素作为插入元素,倒序与有序组比较。
3.在有序组中找到比插入元素小或者大的元素,将插入元素放入该位置,后面元素向后移动一位。
时间复杂度:O(n^2)
稳定性:当A与B相等,排序前A若在B前,排序后A仍然在B前,就说明该排序是稳定的。
插入排序:稳定

//比较两元素大小方法private static boolean greater(Comparable v,Comparable w){return v.compareTo(w)>0;}
//数组中 交换元素位置private static void exch(Comparable[] a,int i,int j){Comparable temp;temp = a[i];a[i] = a[j];a[j] = temp;}
插入排序
public static void insertSort(Comparable[] a){for (int i = 1; i < a.length-1; i++) {for (int j = i+1; j >0; j--) {if (greater(a[j-1],a[j])){exch(a,j-1,j);}else break;}}}
希尔排序
排序原理:
1.选择一个增长量h,按照h将数据分组。
2.每组进行插入排序。
3.减少增长量h直到h=1,重复步骤2
稳定性:不稳定

public static void shellSort(Comparable[] a){int h = 1;//确定hwhile (h<a.length/2){h = 2*h+1;}// 希尔排序while (h>=1){for (int i = h; i < a.length; i=i+h) {for (int j = i; j >= h; j=j-h) {if (greater(a[j-h],a[j])){exch(a,j-h,j);}else break;}}h=h/2;}}
归并排序
排序原理:
1.尽可能的一组数据拆分成两个元素相等的子组,并对每一个子组继续拆分,直到拆分后的每个子
组的元素个数是1为止。
2.将相邻的两个子组进行合并成一个有序的大组;
3.不断的重复步骤2,直到最终只有一个组为止。
时间复杂度:O(nlogn)
稳定性: 稳定

import java.util.Arrays;public class Merge {//归并需要的辅助数组private static Comparable[] assist;//判断v是否比w小private static boolean less(Comparable v,Comparable w){return v.compareTo(w)<0;}//交换元素private static void exch(Comparable[] a,int i,int j){Comparable t = a[i];a[i] = a[j];a[j] = t;}//对数组a排序public static void sort(Comparable[] a){// 1.初始化辅助数组assistassist= new Comparable[a.length];// 定义lo变量和hi变量。分别记录数组中最小的索引和最大的索引int lo = 0;int hi = a.length-1;sort(a,lo,hi);}//对数组a中从lo到hi元素进行排序private static void sort(Comparable[] a,int lo,int hi){//安全检验if (hi<=lo){return;}// 对lo和hi之间的数据进行分为两组int mid = lo+(hi-lo)/2;// 分别排序sort(a,lo,mid);sort(a,mid+1,hi);//两组归并merge(a,lo,mid,hi);}//归并private static void merge(Comparable[] a,int lo,int mid,int hi){// 定义三个指针int i = lo;int p1 = lo;int p2 = mid+1;// 遍历移动p1指针和p2指针,比较对应 索引处的值,找出小的,放到辅助数组对应分索引处while (p1<=mid&&p2<=hi){if (less(a[p1],a[p2])){assist[i++] = a[p1++];}else {assist[i++] = a[p2++];}}//遍历,如果p1的指针没有走完,将p1剩余遍历到辅助数组中while (p1<=mid){assist[i++] = a[p1++];}//遍历,如果p2的指针没有走完,将p2剩余遍历到辅助数组中while (p2<=hi){assist[i++] = a[p2++];}// 把辅助数组中的元素复制到原数组中for (int index = lo;index<=hi;index++){a[index] = assist[index];}}public static void main(String[] args) {Integer[] a={7,8,4,5,6,1,3,9,2};Merge.sort(a);System.out.println(Arrays.toString(a));// [1, 2, 3, 4, 5, 6, 7, 8, 9]}}
快速排序
排序原理:
1.首先设定一个分界值,通过该分界值将数组分成左右两部分;
2.将大于或等于分界值的数据放到到数组右边,小于分界值的数据放到数组的左边。此时左边部分
中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值;
3.然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分
数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处
理。
4.重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧
部分的顺序。当左侧和右侧两个部分的数据排完序后,整个数组的排序也就完成了。
时间复杂度:
平均情况:O(nlogn),最坏情况:O(n^2)
稳定性:不稳定

import java.util.Arrays;public class Quick {private static void exch(Comparable[] a,int i,int j){Comparable t = a[i];a[i] = a[j];a[j] = t;}private static boolean less(Comparable v,Comparable w){return v.compareTo(w)<0;}//对数组内的元素进行排序public static void sort(Comparable[] a){int lo = 0;int hi = a.length-1;sort(a,lo,hi);}//对数组a中从索引hi之间的元素进行排序public static void sort(Comparable[] a,int lo,int hi){if (lo>=hi)return;int partition = partition(a,lo,hi);sort(a,lo,partition-1);sort(a,partition+1,hi);}private static int partition(Comparable[] a,int lo,int hi){//确定分界值Comparable key = a[lo];//定义两个指针,分别指向待切分元素的最小索引处和最大索引处的下一个位置int left = lo;int right = hi+1;//切分 扫描while (true){//先从右边向左扫描,移动right指针,找到比分界值小的,停止while (less(key,a[--right])){if (right==lo){break;}}//从左边向右扫描,移动light指针,找到比分界值大的,停止while (less(a[++left],key)){if (left==hi){break;}}//right<right时交换if (left>=right){break;}else {exch(a,left,right);}}//交换分界值exch(a,lo,right);return right;}public static void main(String[] args) {Integer a[] = {3,6,9,2,5,8,4,7,1};Quick.sort(a);System.out.println(Arrays.toString(a));// [1, 2, 3, 4, 5, 6, 7, 8, 9]}}
相关文章:
插入、希尔、归并、快速排序(java实现)
目录 插入排序 希尔排序 归并排序 快速排序 插入排序 排序原理: 1.把所有元素分为两组,第一组是有序已经排好的,第二组是乱序未排序。 2.将未排序一组的第一个元素作为插入元素,倒序与有序组比较。 3.在有序组中找到比插入…...
怎么把图片表格转换成word表格?几个步骤达成
在处理文档时,图片表格的转换是一个常见的需求。而手动输入表格是非常耗时的,因此,使用文本识别软件来自动转换图片表格可以大大提高工作效率。在本文中,我们将介绍如何使用OCR文字识别技术来将图片表格转换为Word表格。 OCR文字识…...
多线程与高并发--------阻塞队列
四、阻塞队列 一、基础概念 1.1 生产者消费者概念 生产者消费者是设计模式的一种。让生产者和消费者基于一个容器来解决强耦合问题。 生产者 消费者彼此之间不会直接通讯的,而是通过一个容器(队列)进行通讯。 所以生产者生产完数据后扔到…...
前端-NVM,Node.js版本管理
NVM(Node Version Manager)是一个用于管理Node.js版本的工具,主要用于前端开发中。它允许开发者同时安装和切换不同版本的Node.js,以满足不同项目对Node.js版本的需求。 使用NVM可以带来以下几个好处: 多版本管理&…...
React - useEffect函数的理解和使用
文章目录 一,useEffect描述二,它的执行时机三,useEffect分情况使用1,不写第二个参数 说明监测所有state,其中一个变化就会触发此函数2,第二个参数如果是[]空数组,说明谁也不监测3,第…...
python模块 — 加解密模块rsa,cryptography
一、密码学 1、密码学介绍 密码学(Cryptography)是研究信息的保密性、完整性和验证性的科学和实践。它涉及到加密算法、解密算法、密钥管理、数字签名、身份验证等内容。 密码学中的主要概念包括: 1. 加密算法:加密算法用于将…...
【C++】速识模板(template<class T>)
一、引言 在我们学习C时,常会用到函数重载。而函数重载,通常会需要我们编写较为重复的代码,这就显得臃肿,且效率低下。 重载的函数仅仅只是类型不同,代码的复用率比较低,只要有新类型出现时,就…...
腾讯云10万日活服务器配置怎么选?费用多少?
日活10万的小程序或APP使用腾讯云服务器配置怎么选?腾讯云10万人服务器配置多少钱一年?可以选择腾讯云4核8G12M轻量应用服务器或8核16G18M服务器,云服务器CVM的话可以选择标准型S5实例,腾讯云服务器网来详细说下腾讯云日活10万服务…...
vue 使用vue-video-player加载视频(铺满容器)
vue 使用vue-video-player加载视频(铺满容器) 安装 npm install vue-video-player --savemain.js 引入 import VideoPlayer from "vue-video-player" import "video.js/dist/video-js.css" import "vue-video-player/src/custom-theme.css" i…...
OpenCV(三)——图像分割(三)
目录 6.区域生长算法 6.1 区域生长概要 6.2 区域生长原理 7.分水岭算法 7.1 分水岭算法概要...
数论复习c++
改造序列 题目描述 给定长度为 n n n的序列 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an,你可以从中删除一些数,使得删完以后的序列中,所有相邻元素之和均为偶数。请问最少需要删除多少个数? 输入格式 第一行…...
Java try-with-resources 显性 与 隐性 关闭 资源
try-with-resources 是 Java 7 引入的一个语言特性,用于简化资源管理的代码,特别是在处理需要关闭的资源(如文件、网络连接、数据库连接等)时。try-with-resources 允许您在 try 语句中声明需要关闭的资源,这些资源会在…...
Vue在页面输出JSON对象,测试接口可复制使用
效果图: 数据处理前: 数据处理后: 代码实现: HTML: <el-table height"600" :data"tableData" border style"width: 100%" tooltip-effect"dark" size"mini"><el-…...
【STM32】FreeRTOS开启后,不再进入主函数的while(1)
开启freertos后,想在主函数的while(1)中实现led的翻转,发现无法实现。 int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, …...
Python+Selenium+Unittest 之selenium11--WebDriver操作方法1-常用操作
目录 1、send_keys("输入的内容") (输入文字) 2、clear() (清除元素内的内容) 3、click()(点击元素) 4、quit()关闭浏览器 5、refresh()(刷新浏览器页面) 6、set_window_size()和用 maxim…...
气液固三相线识别—Langmuir部分复现
关注 M r . m a t e r i a l , \color{Violet} \rm Mr.material\ , Mr.material...
Redis——常见数据结构与单线程模型
Redis中的数据结构 Redis中所有的数据都是基于key,value实现的,这里的数据结构指的是value有不同的类型。 当前版本Redis支持10种数据类型,下面介绍常用的五种数据类型 底层编码 Redis在实现上述数据结构时,会在源码有特定的…...
大数据-玩转数据-Flink-Transform
一、Transform 转换算子可以把一个或多个DataStream转成一个新的DataStream.程序可以把多个复杂的转换组合成复杂的数据流拓扑. 二、基本转换算子 2.1、map(映射) 将数据流中的数据进行转换, 形成新的数据流,消费一个元素并产出一个元素…...
Java泛型集合简明教程
前言 我们编写一个数组并对数组进行排序,不管是对浮点型数组、整型数组、字符串数组或者是其他任何类型的数组进行排序,我们可以利用方法重载的方式,针对每种类型的数组分别编写一个排序方法,需要为几种类型的数组排序࿰…...
Prometheus-RabbitMQ Exporter
文章目录 一、介绍监控插件两个插件的区别一、 官方插件 rabbitmq_prometheus1 配置 RabbitMQ 集群名称2 授权使用插件2.1 配置文件方式2.2 命令行方式3 监听地址和端口4 RabbitMQ 插件获取指标的频率5 配置到 Prometheus6 关于聚合指标和每个对象指标6.1 获取聚合指标 `/metri…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
rknn toolkit2搭建和推理
安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...
6.计算机网络核心知识点精要手册
计算机网络核心知识点精要手册 1.协议基础篇 网络协议三要素 语法:数据与控制信息的结构或格式,如同语言中的语法规则语义:控制信息的具体含义和响应方式,规定通信双方"说什么"同步:事件执行的顺序与时序…...
Element-Plus:popconfirm与tooltip一起使用不生效?
你们好,我是金金金。 场景 我正在使用Element-plus组件库当中的el-popconfirm和el-tooltip,产品要求是两个需要结合一起使用,也就是鼠标悬浮上去有提示文字,并且点击之后需要出现气泡确认框 代码 <el-popconfirm title"是…...
P10909 [蓝桥杯 2024 国 B] 立定跳远
# P10909 [蓝桥杯 2024 国 B] 立定跳远 ## 题目描述 在运动会上,小明从数轴的原点开始向正方向立定跳远。项目设置了 $n$ 个检查点 $a_1, a_2, \cdots , a_n$ 且 $a_i \ge a_{i−1} > 0$。小明必须先后跳跃到每个检查点上且只能跳跃到检查点上。同时࿰…...
java+webstock
maven依赖 <dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.3.5</version></dependency><dependency><groupId>org.apache.tomcat.websocket</groupId&…...
Python爬虫(52)Scrapy-Redis分布式爬虫架构实战:IP代理池深度集成与跨地域数据采集
目录 一、引言:当爬虫遭遇"地域封锁"二、背景解析:分布式爬虫的两大技术挑战1. 传统Scrapy架构的局限性2. 地域限制的三种典型表现 三、架构设计:Scrapy-Redis 代理池的协同机制1. 分布式架构拓扑图2. 核心组件协同流程 四、技术实…...
