数据结构与算法java实战篇--高级排序

news2025/1/11 2:49:49

目录

一.希尔排序

二.划分

 三.快速排序

1. 快速排序的算法

2.选择枢纽


一.希尔排序

希尔排序是基于插入排序的算法来实现的,不同的是希尔排序是采用n-增量来实现排序,如下是希尔排序的图解:

 希尔排序会先以n个增量对元素进行划分,并排序,然后再向后移动一个,在排序,然后缩小间隔n,循环如此直到元素有序

实现代码:

  class ArraySh{
    private long[] theArray;
    private int nElems;
    //初始化
    public ArraySh(int max){
        theArray=new long[max];
        nElems=0;
    }
    //插入操作
    public void insert(long value){
        theArray[nElems]=value;
        nElems++;
    }
    //显示操作
    public void display(){
        System.out.print("A=");
        for (int i=0;i<nElems;i++)
            System.out.print(theArray[i]+" ");
        System.out.println(" ");
    }
    //排序操作
        public void ShellSort(){
        int innter,outer;
        long temp;
        int h=1;
        while (h<=nElems/3)//间隔大于数组大小结束循环
            h=h*3+1; //whlie循环直到生成最大的间隔h
        while (h>0){ 
            for (outer=h;outer<nElems;outer++){
                temp=theArray[outer]; 
                innter=outer;
                while (innter>h-1&&theArray[innter-h]>=temp){  
                    theArray[innter]=theArray[innter-h];
                    innter-=h;
                }
                theArray[innter]=temp;
            }  //结束for循环
            h=(h-1)/3;
        }
    }
    }


二.划分

划分就是将数据按某个特定值分为两组,大于特定值的分为一组,小于特定值的分为一组,但划分后的数据还不是有序的

代码:

 class Arraypar{
    private long[] theArray;
    private int nElems;
    public Arraypar(int max){
        theArray=new long[max];
        nElems=0;
    }
    //插入操作
    public void insert(long value){
        theArray[nElems]=value;
        nElems++;
    }
    //元素个数
       public int size(){
        return nElems;
       }
       public void display(){
        System.out.print("A=");
        for(int i=0;i<nElems;i++){
            System.out.print(theArray[i]+" ");
        }
        System.out.println(" ");
       }
       //寻找特定值位置
       public int partitionIt(int left,int right,long pivot){
        int leftPtr=left-1;
        int rightPtr=right+1;
        while(true){
            while (left<right&&theArray[++leftPtr]<pivot);//找到比特定值小的
            while (right>left&&theArray[++rightPtr]>pivot);//找到比特定值大的
            if(leftPtr>=rightPtr) //查找完成
                break;
            else
                swap(leftPtr,rightPtr);
        }
        return leftPtr;
       }
       //swap方法
       public void swap(int dex1,int dex2){
        long temp;
        temp=theArray[dex1];
        theArray[dex1]=theArray[dex2];
        theArray[dex2]=temp;
       }
   }

例如:

A=149,192,47,152,159,195,66,61,17,167,118,64,27,80,30,105

特定值为90,在第8位,划分后:

A= 30,80,47,27,64,17,81,66,66,159,152,192,149,105


 三.快速排序

快速排序将元素按一个枢纽分为两组,一组大于枢纽,一组小于枢纽

1. 快速排序的算法

部分代码:

 public void recQuicSort(int left,int right){
        if(right-left<=0)
            return;
        else {
            int partition=paritionIt(left,right);
            recQuicSort(left,partition-1);   //左边子数组排序
            recQuicSort(partition+1,right);   //右边子数组排序
        }
    }

该算法有三个步骤:

1.按枢纽将元素分为左右两个子数组

2.调用自身对左边排序

3.调用自身对右边排序

4.左右排序后合并,完成元素的排序


2.选择枢纽

在对枢纽的选择时,枢纽可以是任意元素,为了方便,我们让枢纽为最右端的元素,然后对排序的算法加入选择枢纽操作:

代码:

 public void recQuicSort(int left,int right){
        if(right-left<=0)
            return;
        else {
                long piovt=theArray[right];  //枢纽
            int partition=paritionIt(left,right,piovt);
            recQuicSort(left,partition-1);   //左边子数组排序
            recQuicSort(partition+1,right);   //右边子数组排序
        }
    }

快速排序代码:

class ArrayIns{
    private long[] theArray;
    private int nElems;
    public ArrayIns(int max){
        theArray=new long[max];
        nElems=0;
    }
    //插入操作
    public void insert(long vallus){
        theArray[nElems]=vallus;
        nElems++;
    }
    //显示
    public void display(){
        System.out.print("A=");
        for(int i=0;i<nElems;i++)
            System.out.print(theArray[i]+" ");
        System.out.println(" ");
    }
    //快速排序
    public void QuickSort(){
        recQuickSort(0,nElems-1);
    }
    public void recQuickSort(int left,int right){
        if (right-left<=0)
            return;
        else {
          long pivot=theArray[right];
            int partitionIt=partitionIt(left,right,pivot);
            recQuickSort(left,partitionIt-1);
            recQuickSort(partitionIt+1,right);
        }
    }
    //枢纽操作
    public int partitionIt(int left,int right,long pivot){
        int leftptr=left-1;
        int rightptr=right;
        while (true){
            while (theArray[++leftptr]<pivot);
            while (theArray[--rightptr]>pivot&&rightptr>0);
            if (leftptr>rightptr)
                break;
            else
                swap(leftptr,rightptr);
        }
        swap(leftptr, Math.toIntExact(pivot));  //枢纽与第一组子数组最右边交换
        return leftptr;
    }
    //交换操作
    public void swap(int dex1,int dex2){
        long temp=theArray[dex1];
        theArray[dex1]=theArray[dex2];
        theArray[dex2]=temp;
    }
}

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

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

相关文章

原神私服 grasscutter搭建及食用教程 v3.3

本教程搭建过程食用vmware虚拟机服务端搭建过程及其简单。照着教程操作即可。本次对应的版本是3.3的版本&#xff0c;后期会持续更新。 一.资源下载准备&#xff1a; 1.vmwera16虚拟机下载安装自己百度吧&#xff0c;非常简单。一路next安装完后再输入一个百度来的秘钥即可。…

【kafka】学习笔记(二)

学习笔记五、Kafka Broker5.1、在zookeeper的服务端存储的Kafka相关信息5.2、Kafka Broker 总体工作流程5.3、Kafka Broker 节点服役和退役5.3.1、节点服役5.3.2、节点退役5.4、Kafka Broker 副本5.4.1、副本信息5.4.3、Leader 选举流程5.4.3、 Leader 和 Follower 故障处理细节…

【OpenCV-Python】教程:7-6 SVM识别手写字符

OpenCV Python SVM 识别手写字符 【目标】 用 SVM 识别手写字符 【代码】 在kNN中&#xff0c;直接用的是像素亮度值&#xff0c;这次&#xff0c;我们将使用 Histogram of Oriented Gradients (HOG) 作为特征向量 import cv2 import numpy as npSZ 20 bin_n 16 # Numbe…

Python pandas有几千个库函数,你用过几个?(5)

上一篇链接&#xff1a; Python pandas有几千个库函数&#xff0c;你用过几个&#xff1f;&#xff08;4&#xff09;_Hann Yang的博客-CSDN博客 12个pandas子模块又包含310个库函数&#xff08;含类、方法、子模块&#xff09;&#xff1a; import pandas as pd funcs [_ …

【C与数据结构】——寒假提高每日练习Day1

一共16日的练习&#xff0c;分为选择题与编程题&#xff0c;涵盖了C语言所学以及数据结构的重点&#xff0c;以及一些秋招、春招面试的高频考点&#xff0c;难度会随着天数而上升。 &#xff08;建议在电脑客户端进行&#xff0c;将鼠标选中被遮挡的地方&#xff0c;即可看到解…

aws codepipeline创建跨账户的cicd

参考资料 Building a Cross-account CI/CD Pipeline Create a pipeline in CodePipeline that uses resources from another AWS account 通常来说&#xff0c;我们会将代码和pipeline配置不同的账户中&#xff0c;在codepipeline的source阶段指定为另一个账号的codecommit仓…

将扩散模型应用到文本领域

前言 扩散模型在文生图领域可谓是大显身手&#xff0c;效果棒棒&#xff5e; 每当一个idea有效之时&#xff0c;便会有更多相关的研究跟进尝试&#xff0c;今天就给大家介绍一篇将扩散模型应用到文本生成领域的工作&#xff0c;这也是一篇比较新的paper&#xff0c;其中还用到了…

LCS+LIS最长公共上升子序列

LIS LCS AcWing 272. 最长公共上升子序列 没优化的代码 优化解释在代码注释中优化解释在代码注释中优化解释在代码注释中 #include<iostream> #include<cstring> #include<algorithm>using namespace std;const int N 3e3 10;int a[N], b[N], f[N][N];i…

开启浏览器sourcemap调试生产环境代码

开启浏览器sourcemap调试生产环境代码 Source Map介绍 在做网站性能优化的时候&#xff0c;我们经常会做js和css代码压缩。但是压缩之 后的代码在调试的时候就会异常困难。source map就是解决问题的一种解决方案 浏览器Source Map 浏览器可以设置开启或者关闭SourceMap&…

78. 子集

78. 子集 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[],[1],[2]…

14【SpringMVC的拦截器】

文章目录一、拦截器1.1 拦截器与过滤器1.2 拦截器的应用1.2.1 HandlerInterceptor接口1.2.2 拦截器的拦截规则1.3 搭建工程测试拦截器1.3.1 测试SpringMVC拦截器1.3.2 SprinMVC拦截器注意事项1.4 HandlerMethod类1.5 多个拦截器的执行顺序一、拦截器 1.1 拦截器与过滤器 过滤…

第6章 el-menu刷新保持当前菜单选项与角色页面

1重构&#xff1a;src\components\AdminLayoutComponen.vue(el-menu刷新保持当前菜单选项) <template> <el-container> <!-- 侧边栏 &#xff0c;"<div class"aside">标签可被删除&#xff0c;为了下拉条控件样式保存了该标签"-->…

maven的插件(命令)install介绍

maven的插件&#xff08;命令&#xff09;install介绍背景关于构建时使用的maven命令installmaven其他插件/命令的使用背景 今天在引入SpringCloudAlibaba时&#xff0c;pom.xml中的dependency报错了 到本地仓库去验证 验证无误&#xff0c;找原因 现象&#xff1a; 在maven…

Flink-状态编程(按键分区状态、算子状态、广播状态、持久化与状态后端)

9 状态编程 9.1 概述 9.1.1 状态 所谓的状态&#xff0c;最常见的就是之前到达的数据&#xff0c;或者由之前数据计算出的某个结果 继承富函数类的函数类就可以获取运行时上下文&#xff0c;也就可以自定义状态&#xff0c;例如process中的ProcessFunction&#xff0c;CoPr…

HTML+CSS+svg绘制精美彩色闪灯圣诞树,HTML+CSS+Js实时新年时间倒数倒计时(附源代码)

HTMLCSSsvg绘制精美彩色闪灯圣诞树&#xff0c; HTMLCSSJs实时新年时间倒数倒计时(附源代码) 本篇目录 一、前言 二、主要功能 三、效果展示 四、编码实现步骤 五、资源下载 六、完整源代码&#xff0c;也可下载打包代码&#xff08;我设的是免费&#xff09; 一、前言…

【Vue】三、Vue.js的常用选项

后端程序员的vue学习之路一、选项 / 数据1、data2、computed3、 methods4、computed 与 methods的区别5、watch二、选项 / DOMeltemplate三、选项 / 生命周期钩子1、生命周期钩子有如下这些&#xff1a;2、流程图2、练习代码四、选项 / 资源1、filters2、directives3、componen…

大半夜睡不着,聊一下在小外包公司工作一年后的感想吧

我不知道当年怎么想的&#xff0c;能在一个外包公司一干就是6年&#xff0c;后来终于跳出来了&#xff0c;现在的公司虽然不是什么大厂吧&#xff0c;但至少是个正经的互联网企业&#xff0c;待遇也不错。 其实很多地方的朋友都有提到外包公司的一些弊端&#xff1a; 1.工期短…

自己动手实现一个轮播图组件

1. 轮播图原理 轮播图的原理可以总结为两点&#xff1a; 定位的运用定时器的运用 轮播图的每一张图横向依次排列。在最外层还有一个父级盒子&#xff0c;它的宽度刚好是一张图片的宽度&#xff0c;第一张图没有设置隐藏超出部分&#xff0c;第二张图隐藏了超出部分。 当我们…

河道非法采砂识别系统 yolov5

河道非法采砂识别系统通过yolov5网络架构深度学习技术对河道非法采砂行为进行实时分析检测&#xff0c;如yolov5架构模型发现现场违规采砂&#xff0c;则立即抓拍回传后台。YOLO算法- YOLO算法是一种基于回归的算法&#xff0c;它不是选择图像中有趣的部分&#xff0c;而是预测…

世界杯已开赛,哪些看球设备让你觉得身临其境?

笔者在父亲的影响下&#xff0c;从1994年美国世界杯开始接触足球&#xff0c;因为当时 CCTV5 对拥有着小世界杯之称的意甲转播&#xff0c;成为了一名意大利足球队的忠实拥趸&#xff0c;一直到现在。 四年一次的世界杯也成了我从不错过的足球盛宴。2002年日韩世界杯和2006年德…