二、高级排序

news/2024/4/26 8:36:49/文章来源:https://blog.csdn.net/qq_58210976/article/details/129223208

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

前言

一、希尔排序

1.排序原理

2.希尔排序实现

2.1 希尔排序API

2.2 希尔排序实现

二、归并排序

1.排序原理

2.归并排序实现

2.1 归并排序API

2.2 归并排序实现

三、快速排序

1.排序原理

2.快速排序实现

2.1 快速排序API

2.2 快速排序实现

总结


前言

提示:这里可以添加本文要记录的大概内容:

自学JAVA数据结构笔记,跟学视频为:黑马程序员Java数据结构与java算法全套教程,数据结构+算法教程全资料发布,包含154张java数据结构图_哔哩哔哩_bilibili


提示:以下是本篇文章正文内容,下面案例可供参考

一、希尔排序

1.排序原理

1.选定一个增长量h,按照增长量h作为数据分组的依据,对数据进行分组;

2.对分好组的每一组数据完成插入排序;

3.减小增长量,最小减为1,重复第二步操作

2.希尔排序实现

2.1 希尔排序API

类名             Shell

构造方法      Shell():创建Shell对象

成员方法 1.public static void sort(Comparable[] a):对数组内的元素进行排序 2.private static boolean greater(Comparable v,Comparable w):判断v是否大于w 3.private static void exch(Comparable[] a,int i,int j):交换a数组中,索引i和索引j处的值

2.2 希尔排序实现

希尔排序类:

package sort;public class Shell {public static void sort(Comparable[] nums){int len = nums.length;//确定增长量h的最大值int h = 1;while(h < len / 2){h = h * 2 + 1;}//当增长量h小于1时,排序结束while(h >= 1){for(int i = h;i < len;i ++){//找到待插入元素for(int j = i;j >= h;j -= h){if(greater(nums[j - h],nums[j])){//找到最小值,交换exch(nums,j - h,j);}else{break;}}}//更新h值h = h / 2;}}//判断v是否大于wprivate static boolean greater(Comparable v,Comparable w){return v.compareTo(w) > 0;}//交换private static void exch(Comparable[] nums,int i,int j){Comparable temp = nums[i];nums[i] = nums[j];nums[j] = temp;}
}

测试类:

package sort;import java.util.Arrays;public class ShellTest {public static void main(String[] args) {Integer[] nums = {3,6,7,9,0,1,4,2,5,8};Shell.sort(nums);System.out.println(Arrays.toString(nums));}}

二、归并排序

1.排序原理

1.尽可能的一组数据拆分成两个元素相等的子组,并对每一个子组继续拆分,直到拆分后的每个子组的元素个数是 1为止。

2.将相邻的两个子组进行合并成一个有序的大组;

3.不断的重复步骤2,直到最终只有一个组为止。

2.归并排序实现

2.1 归并排序API

类 名                 Merge

构 造 方 法        Merge():创建Merge对象

成 员 方 法        1.public static void sort(Comparable[] a):对数组内的元素进行排序                                       2.private static void sort(Comparable[] a, int lo, int hi):对数组a中从索引lo到索引hi之间的元素进 行排序

                        3.private static void merge(Comparable[] a, int lo, int mid, int hi):从索引lo到所以mid为一个子 组,从索引mid+1到索引hi为另一个子组,把数组a中的这两个子组的数据合并成一个有序的大组(从 索引lo到索引hi)

                        4.private static boolean less(Comparable v,Comparable w):判断v是否小于w  成 员 变 量      1.private static Comparable[] assist:完成归并操作需要的辅助数组

2.2 归并排序实现

归并排序类:

package sort;public class Merge {private static Comparable[] assist;//归并所需要的辅助数组//排序算法public static void sort(Comparable[] nums) {//根据输入数组的长度创建辅助数组assist = new Comparable[nums.length];//左指针int left = 0;//右指针int right = nums.length-1;//排序sort(nums, left, right);}//重写sortprivate static void sort(Comparable[] nums, int left, int right) {if (right <= left) {return;}int mid = left + (right - left) / 2;//对left到mid之间的元素进行排序;sort(nums, left, mid);//对mid+1到right之间的元素进行排序;sort(nums, mid + 1, right);//对lo到mid这组数据和mid到hi这组数据进行归并merge(nums, left, mid, right);}private static void merge(Comparable[] nums, int left, int mid, int right) {int i = left;       //指向assist数组中开始填充数据的索引int p1 = left;      //指向第一组数据的第一个元素int p2 = mid + 1;   //指向第二组数据的第一个元素//比较左边小组和右边小组中的元素大小,哪个小,就把哪个数据填充到assist数组中while(p1 <= mid && p2 <= right){if(less(nums[p1],nums[p2])){//如果p1比p2小,则将p1加入辅助数组assist[i++] = nums[p1++];}else{//如果p2比p1小,则将p2加入辅助数组assist[i++] = nums[p2++];}}//当第一组数据没有遍历完即p1没有走完//将p1剩下元素全部加入辅助数组中while(p1 <= mid){assist[i++] = nums[p1++];}//当第二组数据没有遍历完即p2没有走完//将p2剩下元素全部加入辅助数组中while (p2 <= right){assist[i++] = nums[p2++];}//最后将辅助数组中的数据全部放回nums中if (right + 1 - left >= 0) {System.arraycopy(assist, left, nums, left, right + 1 - left);}}//判断v是否小于wprivate static boolean less(Comparable v, Comparable w) {return v.compareTo(w) < 0;}}

测试类:

package sort;import java.util.Arrays;public class MergeTest {public static void main(String[] args) {Integer[] nums = {3,6,7,9,0,1,4,2,5,8};Merge.sort(nums);System.out.println(Arrays.toString(nums));}}

三、快速排序

1.排序原理

1.首先设定一个分界值,通过该分界值将数组分成左右两部分;

2.将大于或等于分界值的数据放到到数组右边,小于分界值的数据放到数组的左边。此时左边部分中各元素都小于 或等于分界值,而右边部分中各元素都大于或等于分界值;

3.然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两 部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。

4.重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当 左侧和右侧两个部分的数据排完序后,整个数组的排序也就完成了。

切分原理: 把一个数组切分成两个子数组的基本思想:

1.找一个基准值,用两个指针分别指向数组的头部和尾部;

2.先从尾部向头部开始搜索一个比基准值小的元素,搜索到即停止,并记录指针的位置;

3.再从头部向尾部开始搜索一个比基准值大的元素,搜索到即停止,并记录指针的位置;

4.交换当前左边指针位置和右边指针位置的元素;

5.重复2,3,4步骤,直到左边指针的值大于右边指针的值停止。

2.快速排序实现

2.1 快速排序API

类名                 Quick

构造方法          Quick():创建Quick对象

成员方法          1.public static void sort(Comparable[] a):对数组内的元素进行排序

                        2.private static void sort(Comparable[] a, int lo, int hi):对数组a中从索引lo到索引hi之间的元素 进行排序

                        3.public static int partition(Comparable[] a,int lo,int hi):对数组a中,从索引 lo到索引 hi之间的元 素进行分组,并返回分组界限对应的索引

                        4.private static boolean less(Comparable v,Comparable w):判断v是否小于w                         5.private static void exch(Comparable[] a,int i,int j):交换a数组中,索引i和索引j处的值

2.2 快速排序实现

快速排序类:

package sort;public class Quick {//排序算法public static void sort(Comparable[] nums) {//左指针int left = 0;//右指针int right = nums.length-1;//排序sort(nums, left, right);}//重写sortprivate static void sort(Comparable[] nums, int left, int right) {if (right <= left) {return;}//对nums数组中,从left到right的元素进行切分int partition = partition(nums, left, right);//对左边分组中的元素进行排序sort(nums, left, partition - 1);//对右边分组中的元素进行排序sort(nums, partition + 1, right);}private static int partition(Comparable[] nums, int left,int right) {Comparable key = nums[left];    //把最左边的元素当做基准值int p1 = left;               //初始指向最左边的元素int p2 = right + 1;          //初始指向左右侧的元素下一个位置//进行切分while(true){//先从右往左扫描,找到一个比基准值小的元素while(less(key,nums[--p2])){//循环停止,证明找到了一个比基准值小的元素if (p2 == left){//已经扫描到最左边了,无需继续扫描break;}}//再从左往右扫描,找一个比基准值大的元素//循环停止,证明找到了一个比基准值大的元素while(less(nums[++p1],key)){if (p1 == right){//已经扫描到了最右边了,无需继续扫描break;}}if (p1 >= p2){//扫描完了所有元素,结束循环break;}else{//交换p1和p2索引处的元素exch(nums,p1,p2);}}//交换最后p2索引处和基准值所在的索引处的值exch(nums,left,p2);//p2就是切分的界限return p2;}//判断v是否小于wprivate static boolean less(Comparable v, Comparable w) {return v.compareTo(w) < 0;}//交换private static void exch(Comparable[] nums,int i,int j){Comparable temp = nums[i];nums[i] = nums[j];nums[j] = temp;}
}

测试类:

package sort;import java.util.Arrays;public class QuickTest {public static void main(String[] args) {Integer[] nums = {3,6,7,9,0,1,4,2,5,8};Quick.sort(nums);System.out.println(Arrays.toString(nums));}}

总结

提示:这里对文章进行总结:

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

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

相关文章

Python 多进程多线程线程池进程池协程

目录 一、线程与进程很简单的介绍 1.1 线程与进程的区别 二、多进程Process 2.1 多进程与多线程的区别 2.2 多进程为啥要使用队列 2.3 控制进程运行顺序 2.3.1 join &#xff0c; 2.3.1 daemon 守护进程 2.4 进程id 2.5 进程 存活状态is_alive() 2.5 实现自定义多…

计算机图形学:liang算法和Cyrus-Beck算法

其中Cyrus-Beck算法呢&#xff0c;是计算一根直线一个多边形的交线段&#xff1b;liang算法是Cyrus的一个特例&#xff0c;即多边形刚好是矩形&#xff1b;先看看Cyrus算法的思路【从别的博客找的图片】&#xff1a;这很容易理解&#xff0c;点积>0时就可能中内部嘛&#xf…

Pyinstaller 打包EXE(七) 百篇文章学PyQT

本文章是百篇文章学PyQT6的第七篇&#xff0c;本文讲述如何使用Pyinstaller打包UI界面和代码&#xff0c;将程序打包成EXE来更为方便的进行部署&#xff0c;在写博客和学习的过程中会遇到很多问题&#xff0c;例如&#xff1a;PyQT6在网上很多博客都是PyQT5、或者PyQT4大部分都…

Amazon S3 服务15岁生日快乐!

2021年3月14日&#xff0c;作为第一个发布的服务&#xff0c;Amazon S3 服务15周岁啦&#xff01;在中国文化里&#xff0c;15岁是个临界点&#xff0c;是从“舞勺之年”到“舞象之年”的过渡。相信对于 Amazon S3 和其他的云服务15周岁也将是其迎接更加美好未来的全新起点。亚…

java面试题-JVM内存结构

整体结构&#xff1a;1.说说JVM内存整体的结构&#xff1f;线程私有还是共享的&#xff1f;JVM&#xff08;Java Virtual Machine&#xff09;内存可以分为以下几个部分&#xff1a;程序计数器&#xff08;Program Counter Register&#xff09;&#xff1a;是线程私有的&#…

深入浅出解析ChatGPT引领的科技浪潮【AI行研商业价值分析】

Rocky Ding写在前面 【AI行研&商业价值分析】栏目专注于分享AI行业中最新热点/风口的思考与判断。也欢迎大家提出宝贵的意见或优化ideas&#xff0c;一起交流学习&#x1f4aa; 大家好&#xff0c;我是Rocky。 2022年底&#xff0c;ChatGPT横空出世&#xff0c;火爆全网&a…

Linux学习(8.6)文件与目录的默认权限与隐藏权限

目录 文件与目录的默认权限与隐藏权限 文件的默认权限&#xff1a;umask chattr (配置文件隐藏属性) lsattr (显示文件隐藏属性) 文件特殊权限&#xff1a; SUID, SGID, SBIT 观察文件类型&#xff1a;file 以下内容转载自鸟哥的Linux私房菜 文件与目录的默认权限与隐藏权…

【架构师】零基础到精通——架构发展

博客昵称&#xff1a;架构师Cool 最喜欢的座右铭&#xff1a;一以贯之的努力&#xff0c;不得懈怠的人生。 作者简介&#xff1a;一名Coder&#xff0c;软件设计师/鸿蒙高级工程师认证&#xff0c;在备战高级架构师/系统分析师&#xff0c;欢迎关注小弟&#xff01; 博主小留言…

【20230225】【剑指1】分治算法(中等)

1.重建二叉树class Solution { public:TreeNode* traversal(vector<int>& preorder,vector<int>& inorder){if(preorder.size()0) return NULL;int rootValuepreorder.front();TreeNode* rootnew TreeNode(rootValue);//int rootValuepreorder[0];if(preo…

redis秒杀

redis优惠券秒杀 为什么订单表订单ID不采用自增长&#xff1f; id规律性太明显&#xff0c;容易被用户猜测到&#xff08;比如第一天下订单id10&#xff0c;第二天下订单id100&#xff0c;在昨天的1天内只卖出90商品&#xff09;受单表数据量限制&#xff08;订单数据量大&am…

从零开始学习iftop流量监控(找出服务器耗费流量最多的ip和端口)

一、iftop是什么iftop是类似于top的实时流量监控工具。作用&#xff1a;监控网卡的实时流量&#xff08;可以指定网段&#xff09;、反向解析IP、显示端口信息等官网&#xff1a;http://www.ex-parrot.com/~pdw/iftop/二、界面说明>代表发送数据&#xff0c;< 代表接收数…

chatGPT模型原理

文章目录简介BertGPT 初代GPT-2GPT-3chatGPT开源ChatGPT简介 openai 的 GPT 大模型的发展历程。 Bert 2018年&#xff0c;自然语言处理 NLP 领域也步入了 LLM 时代&#xff0c;谷歌出品的 Bert 模型横空出世&#xff0c;碾压了以往的所有模型&#xff0c;直接在各种NLP的建模…

EasyRecovery16MAC苹果版本Photo最新版数据恢复软件

无论是在工作学习中&#xff0c;还是在生活中&#xff0c;Word、Excle等办公软件都是大家很常用的。我们在使用电脑的过程中&#xff0c;有时会因自己的误删或电脑故障&#xff0c;从而导致我们所写的文档丢失了。出现这样的大家不要着急&#xff0c;今天小编就给大家推荐一款可…

FreeRTOS优先级翻转

优先级翻转优先级翻转&#xff1a;高优先级的任务反而慢执行&#xff0c;低优先级的任务反而优先执行优先级翻转在抢占式内核中是非常常见的&#xff0c;但是在实时操作系统中是不允许出现优先级翻转的&#xff0c;因为优先级翻转会破坏任务的预期顺序&#xff0c;可能会导致未…

YOLOv5模型学习记录

新年伊始&#xff0c;YOLOv8横空出世&#xff0c;这个还未开源时便引发界内广泛热议的目标检测算法&#xff0c;一经问世便再次引发热潮&#xff0c;而作为与其师出同源的YOLOv5&#xff0c;自然要拿来与其比较一番。接下来我们便来学习一下吧。 模型结构 首先便是模型结构了…

Rasa 3.x 学习系列-摆脱意图:一种新的对话模式

Rasa 3.x 学习系列-摆脱意图:一种新的对话模式 在2019年的一篇文章中,Alan Nichol写道 :是时候摆脱意图了。一年后,Rasa发布了Rasa中的第一个无意图(或“端到端”)对话模型。现在,我们宣布迈出了一个重要的步伐,将LLM的强大功能带入Rasa的对话管理中。 首先,意图非常…

ACSC 2023 比赛复现

Admin Dashboard 在 index.php 中可以看到需要访问者是 admin 权限&#xff0c;才可以看到 flag。 report.php 中可以让 admin bot 访问我们输入的 url&#xff0c;那么也就是说可以访问 addadmin.php 添加用户。 在 addadmin.php 中可以添加 admin 用户&#xff0c;但是需…

李宏毅2023春季机器学习课程

目录2021&2022课程重磅须知我维护的其他项目更新日志课程地址课程资料直链课程作业直链其他优质课程2021&2022课程 CSDN Github 重磅须知 为方便所有网课资料与优质电子书籍的实时更新维护&#xff0c;创建一个在线实时网盘文件夹&#xff1b;   网盘获取方式&#…

mindspore的MLP模型(多层感知机)

导入模块 import hashlib import os import tarfile import zipfile import requests import numpy as np import pandas as pd import mindspore import mindspore.dataset as ds from mindspore import nn import mindspore.ops as ops import mindspore.numpy as mnp from …

Springdoc Swagger UI集成OAuth2认证

目录引言方式1&#xff1a;Bearer Token方式2&#xff1a;标准OAuth2授权码流程方式3&#xff1a;集成OIDC发现端点扩展&#xff1a;同时支持多种认证方式引言 之前的文章讲过OAuth2体系&#xff0c;以授权码流程为例&#xff08;参见下图&#xff09;&#xff0c; 其中资源服…