经典排序算法JAVA实现

news2024/11/18 15:38:07

1、选择排序

首先在未排序数列中找到最小元素,然后将其与数列的首部元素进行交换,然后,在剩余未排序元素中继续找出最小元素,将其与已排序数列的末尾位置元素交换。以此类推,直至所有元素均排序完毕.复杂度为n2,复杂度还是相当高的

选择排序即是采用交换次数最少的方针进行排序,选择排序的交换次数要远远少于冒泡排序

力扣2471逐层排序二叉树所需的最少操作数目用到了选择排序算法

选择排序算法是不稳定的,值相同的元素的相对位置可能会发生改变,这一点需要特别注意

 2、快速排序

快速排序是不稳定的

快速排序的时间复杂度在最坏情况下是O(N2),平均的时间复杂度是O(N*lgN)。

 详细思路见常见几种java排序算法_zzzgd816的博客-CSDN博客

代码及注解如下所示

public void sort(int arr[],int begin,int end){
        if(begin>=end){
            return;
        }
        //左边的i,左指针
        int start_pos=begin;
        //右边的j,右指针
        int end_pos=end;
        //基准值,默认为第一个元素
        int standard=arr[start_pos];
        while (start_pos<end_pos){
            //右指针开始往左移,寻找比基准值小的元素
            while (start_pos<end_pos&&standard<=arr[end_pos]){
                end_pos--;
            }
            //如果确实找到该元素,那么就进行置换,置换过后左指针右移一位
            if(arr[end_pos]<standard){
                arr[start_pos]=arr[end_pos];
                start_pos++;
            }
            //左指针开始往右移动,寻找比基准值大的元素
            while (start_pos<end_pos&&standard>=arr[start_pos]){
                start_pos++;
            }
            //如果确实找到该元素,那么就进行置换,置换过后右指针左移一位
            if(arr[start_pos]>standard){
                arr[end_pos]=arr[start_pos];
                end_pos--;
            }
        }
        //左右指针重叠,将基准值赋予左右指针重叠处
        arr[start_pos]=standard;
        //分治递归
        sort(arr,begin,start_pos-1);
        sort(arr,start_pos+1,end);
 }

3、堆排序

什么是堆?

 堆的实现方式: 

数组按顺序存储层序遍历的二叉树,按顺序全部放进来,因为是完全二叉树,数组中间不可能存在空缺

 用数组存储这样的好处便是,已知一个节点在数组中的索引为k时,它的父节点位置为k/2,它的两个子结点的位置分别为2k和2k+1.如此这般,在不使用指针的情况下,也可以通过计算数组的索引在树中上下移动,从a[k]向上一层,就令k=k/2,向下一层就令k等于2k或2k+1

堆的特性:

对于每个节点的值都大于等于子树中每个节点值的堆,我们叫做“大顶堆”。对于每个节点的值都小于等于子树中每个节点值的堆,我们叫做“小顶堆”。

堆的插入:

 插入新节点s,插入节点后,堆不一定还是标准的堆,需要将插入的元素不断向父节点的值去做比较,如果不符合条件,则交换两者的值,直到父节点的值与子节点的关系符合条件为止,如图所示:

 堆的删除:

以删除根节点为例,将堆中最后一个元素与根节点元素互换,如图所示

 将置换后的根节点删除,如图所示,

 此时堆并不是标准的堆,要通过不断调整使得堆变成标准堆(下沉操作),通过逐次下沉操作使得堆变为标准堆

 

 

 堆基本操作的代码如下所示,包含堆的插入节点、删除节点、上浮、下沉等算法

public class Heap<T extends Comparable<T>>{
        //存储堆中的元素
        private T[] items;
        //记录堆中元素的个数
     private int N;
     //初始化,数组中的0索引处已经废弃掉了
     public Heap(int capacity){
         this.items=(T[]) new Comparable[capacity+1];
         this.N=0;
     }
     //判断堆中索引i处的元素是否小于索引j处的元素
     private boolean less(int i,int j){
         return items[i].compareTo(items[j])<0;
     }
     //交换堆中i索引和j索引处的值
     private void exch(int i,int j){
         T temp=items[i];
         items[i]=items[j];
         items[j]=temp;
     }
     //往堆中插入一个元素
     public void insert(T t){
         items[++N]=t;
         //使得插入的元素处于正确的位置
         swim(N);
     }
     //使用上浮算法,使得索引k处的元素能在堆中处于一个正确的位置
     public void swim(int k){
         //通过循环,不断比较当前节点的值和父节点的值,如果发现父节点的值比当前节点小,则交换位置
         while (k>1){
             //比较当前节点和其父节点,如果小,则交换两者的位置
             if(less(k/2,k)){
                 exch(k/2,k);
             }
             k=k/2;
         }
 }
 //删除堆中最大的元素,并返回这个最大元素
      public T delMax(){
       T max=items[1];
       //交换索引1处的元素和最大索引处的元素,让完全二叉树的最右侧元素变成临时根节点
        exch(1,N);
          //删除最大索引处的节点
      items[N]=null;
          //元素个数减一
N--;
          //通过下沉调整堆,让堆重新有序
          sink(1);
          return max;
   }
   //使用下沉算法
   public void sink(int k){
         //通过循环不断对比当前k节点及其左子节点2k、右子节点2k+1,如果当前节点小,则需要交换位置
       //存在删除后不存在右子节点的情况

       //-----------------这里的范围非常关键
       while (2*k<=N){
           //-------------------
           //获取当前节点的较大子节点值
           int max;//记录较大节点所在的索引
           if(2*k+1<=N){
               if(less(2*k,2*k+1)){
                   max=2*k+1;
               }
               else {
                   max=2*k;
               }
           }
           else {
               max=2*k;
           }
           //如果已经符合条件
           if(!less(k,max)){
               break;
           }
           //如果不符合条件,则交换k和max索引处的值
           exch(k,max);
           //k往下走
           k=max;

       }
   }

 }

时间复杂度,空间复杂度分析见排序算法之 堆排序 及其时间复杂度和空间复杂度_庾志辉的博客-CSDN博客_堆排序时间复杂度

具体原理,代码实现见

Java实现堆排序及详细图解_又蠢又笨的懒羊羊程序猿的博客-CSDN博客

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

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

相关文章

《Java并发编程之美》读书笔记——第一部分(并发编程基础知识)

文章目录第一章 并发编程线程基础1.什么是线程2.线程的创建与运行3.线程的通知与等待wait()wait(long timeout)wait(long timeout, int nanos)notify()与notifyAll()虚假唤醒4.等待线程执行终止的join方法5.让线程睡眠的sleep方法6.让CPU交出执行权的yield方法7.线程中断8.理解…

[附源码]java毕业设计物理中考复习在线考试系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

消息队列卡夫卡+EFLFK集群部署

pache公司的软件包官方下载地址&#xff1a;archive.apache.org/dist/ 注&#xff1a;kafka从3.0版本之后&#xff0c;不再依赖zookeeper。 一 Zookeeper概述 官方下载地址&#xff1a;archive.apache.org/dist/zookee… 1.Zookeeper定义 Zookeeper是一个开源的分布式的&a…

国内网络编译,Ambari 2.7.6 全部模块源码编译笔记

本次编译 ambari 2.7.6 没有使用科学上网的工具&#xff0c;使用的普通网络&#xff0c;可以编译成功&#xff0c;过程比 ambari 2.7.5 编译时要顺畅。 该版本相对 2.7.5 版本以来&#xff0c;共有 26 个 contributors 提交了 114 个 commits 以及修改了 557 个文件。详情见&a…

ovirt-engine通过UI Plugin自定义页面

官方API&#xff1a;点击打开 1 新增一个菜单项 1.1 创建引导html 首先你的这个页面是作为一个功能插件存在的&#xff0c;所以先给他起个名字&#xff0c;我这里的页面主要是用作用户创建&#xff0c;所以我的这个插件的名字就叫user。 接着就创建这个插件的 引导html &…

多级式多传感器信息融合中的状态估计(Matlab代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

新能源车提车、上牌流程

漫长等待四个多月&#xff0c;终于2022年10月27日&#xff0c;笔者圆梦&#xff0c;喜提人生第一辆车。从选车、提车、上牌全程一人&#xff0c;用文记录下经历&#xff0c;以供参考。 一、提车流程 1.1 提车时间 若分到车&#xff0c;4S店销售会提前联系确定时间。 提示&…

【自然语言处理】【实体匹配】CollaborER:使用多特征协作的自监督实体匹配框架

CollaborER&#xff1a;使用多特征协作的自监督实体匹配框架《CollaborER: A Self-supervised Entity Resolution Framework Using Multi-features Collaboration》论文地址&#xff1a;https://arxiv.org/pdf/2108.08090.pdf 相关博客&#xff1a; 【自然语言处理】【实体匹配…

最大似然估计(机器学习)

目录 最大似然估计算法 最大似然估计例子 最大似然估计算法存在的问题 最大似然估计算法 EM算法是一种最大似然估计(Max imum Likel ihood Est imation)算法&#xff0c;传统的最大似然估计算法是根据已知的观察数据来评估模型参数 最大似然估计的一般步骤如下&#xff1a; …

HTML小游戏10 —— 休闲类游戏《解救海盗船长》(附完整源码)

&#x1f482; 网站推荐:【神级源码资源网】【摸鱼小游戏】&#x1f91f; 风趣幽默的前端学习课程&#xff1a;&#x1f449;28个案例趣学前端&#x1f485; 想寻找共同学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】&#x1f4ac; 免费且实用的计算机相关知…

kingbase之集群部署之集群规划和安装

一、kingbase简介 KingbaseES是一款面向大规模并发交易处理的企业级关系型数据库。该产品支持严格的ACID特性、结合多核架构的极致性能、行业最高的安全标准&#xff0c;以及完备的高可用方案&#xff0c;并提供可覆盖迁移、开发及运维管理全使用周期的智能便捷工具。在早先的博…

zsh: command not found: adb问题分析

问题描述 Mac上使用 adb 调试Android设备时&#xff0c;出现了 zsh: command not found: adb 的报错提示。 出现上述错误代表 adb 无法在挡枪 的shell 中使用&#xff0c;而当前的 shell 为 zsh 。 zsh 介绍 zsh 也是一种 shell &#xff0c;Unix 衍生系统的默认 的shell 都…

如何使用组件切换器做话题导航

highlight: atelier-cave-dark 使用组件切换器实现一个标签导航 效果展示 前置准备 背景素材 话题图标素材 具体步骤 制作背景 制作话题导航 制作话题导航结果列表 设置组件切换器关联内容 创建切换组件行为触发器 创建点击行为触发器 步骤分解 制作背景 将背景素材添加到 …

Vue使用axios进行get请求拼接参数的两种方式

前言 本文主要介绍如何在Vue使用axios进行get请求拼接参数的两种方式 我们就以github上的一个开源接口举例&#xff1a; https://api.github.com/search/users?qxxx 这是github给开发人员提供的一个接口&#xff0c;是get请求。我们可以直接通过浏览器访问 很明显&#xff…

[附源码]java毕业设计网易云音乐推荐系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

FL Studio21傻瓜式编曲音乐编辑器FL水果软件

在我看来软件只是工具.不管哪个都可以做任何风格的音乐,区别只是软件操作相对而言fl studio更容易上手,在国内也很受欢迎,弱项应该是混音上如果你做电音的话 还是FL更好一些 ,因为他就是为舞曲而生的!flstudio内配置音源、插件、录音软件、混音效果!而FLStudio则更偏向于电子音…

[附源码]SSM计算机毕业设计二手车况在线评估JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

分库分表-分片算法运用

分库分表-分片算法运用 ShardingSphere 分片算法 用于将数据分片的算法&#xff0c;支持 、>、<、>、<、BETWEEN 和 IN 进行分片。分片算法可由开发者自行 实现&#xff0c;也可使用 Apache ShardingSphere 内置的分片算法语法糖&#xff0c;灵活度非常高。原理简…

uploads_labs前9题

upload-labs详解1.代码使用的函数详解2.uploads_labs1.Pass-012.Pass-023.Pass-034.Pass-045.Pass-056.Pass-067.Pass-078.Pass-089.Pass-091.代码使用的函数详解 2.uploads_labs 1.Pass-01 function checkFile() {var file document.getElementsByName(upload_file)[0].va…

一年前端面试打怪升级之路

Promise是什么? Promise 是异步编程的一种解决方案&#xff1a;从语法上讲&#xff0c;promise是一个对象&#xff0c;从它可以获取异步操作的消息&#xff1b;从本意上讲&#xff0c;它是承诺&#xff0c;承诺它过一段时间会给你一个结果。promise有三种状态&#xff1a; pe…