java排序算法

Java常用排序算法 阅读详情


排序算法

对一序列对象根据某个关键字进行排序


一、冒泡排序(Bubble Sort)

1.原理

1.比较相邻的元素,如果第一个比第二个大,就交换他们两个;

2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数;

3.针对除了最后一个之外的所有的元素重复以上的步骤;

4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

2.代码实现

public static long[] bubblesort(long[] array) {
        if(array.length==0)
            return array;
        for (int i = 0; i <array.length; i++) {
            for (int j = 0; j <array.length-1-i ; j++) {
                if (array[j]>array[j]){
                    long temp= array[j];
                    array[j]=array[j];
                    array[j]=temp;
                }
            }
        }
        return array;
    }

二、快速排序(Quick Sort)

1.原理

1.在数组中选一个基准数pivot(我选取了数字的最后一个数字作为基准数);

2.通过“遍历的方式”,比较给定元素和区间内其他元素的大小关系,形成<=pivot,pivot,>=pivot三个区间;

3.对于基准数左、右两边的数组,不断重复以上两个过程,直到每个子集只有一个元素,即为全部有序。

2.代码实现

public static void quickSort(long[] array) {
        quickSortRange(array, 0, array.length - 1);
    }
    // 为了代码书写方便,我们选择使用左闭右闭的区间表示形式
    // 其中,from,to 下标的元素都算在区间的元素中
    // 左闭右闭的情况下,区间内的元素个数 = to - from + 1;
    private static void quickSortRange(long[] array, int from, int to) {
        if (to - from + 1 <= 1) {
            // 区间中元素个数 <= 1 个
            return;
        }
        // 挑选中区间最右边的元素 array[to]
        int pi = partitionMethodA(array, from, to);
        quickSortRange(array, from, pi - 1);    
        // 针对小于等于 pivot 的区间做处理
        quickSortRange(array, pi + 1, to);   
        // 针对大于等于 pivot 的区间做处理
    }

    private static int partitionMethodA(long[] array, int from, int to) {
        // 1. 先把 pivot 找出来
        long pivot = array[to];
        // 2. 通过定义 left 和 right 两个下标,将区间划分出来
        int left = from;
        int right = to;
        // [from, left)   都是 <= pivot 的
        // [left, right)  都是未参与比较的
        // [right, to]    都是 >= pivot 的
        while (left < right) {
            // 随着 left 在循环过程中一直在 left++,请问 left < right 的条件不一定能保证,所以,我们时刻进行 left < right 条件的保证
            while (left < right && array[left] <= pivot) {
                left++;
            }
            while (left < right && array[right] >= pivot) {
                right--;
            }
            // 循环停止时,说明 array[right] < pivot
            // 两边都卡住时,交换 [left] 和 [right] 位置的元素
            long t = array[left];
            array[left] = array[right];
            array[right] = t;
        }
        long t = array[to];
        array[to] = array[left];
        array[left] = t;
        // 返回 pivot 最终所在下标
        return left;
    }

三、选择排序(Selection Sort)

1.原理

1.遍历所有数据,先在数据中找出最大或最小的元素,放到序列的起始;
2.再从余下的数据中继续寻找最大或最小的元素,依次放到序列中;
3.直到所有数据有序。

2.代码实现

public static long[] selectionsort(long[] array){
        if (array.length == 0)
            return array;
        for (int i = 0; i < array.length; i++) {
            int minIndex = i;
            for (int j = i+1; j < array.length; j++) {
                if (array[j] < array[minIndex]) 
                //找到最小的数
                    minIndex = j; 
                    //将最小数的索引保存
            }
            long temp = array[minIndex];
            array[minIndex] = array[i];
            array[i] = temp;
        }
        return array;
    }

四、插入排序(Insertion Sort)

1.原理

将前i个(初始为1)数据假定为有序序列,依次遍历数据,将当前数据插入到前述有序序列的适当位置,形成前i+1个有序序列,依次遍历完所有数据,直至序列中所有数据有序。

2.代码实现

// [from, to] 是左闭右闭的
    private static void insertSortRange(long[] array, int from, int to) {
        int size = to - from;
        for (int i = 0; i < size; i++) {
            // 有序区间 [from, from + i]
            // 无序区间 [from + i + 1, to]
            // 选中的无序区间的第一个元素 array[from + i + 1]
            long key = array[from + i + 1];
            int j;
            for (j = from + i; j >= from && array[j] > key; j--) {
                array[j + 1] = array[j];
            }
            array[j + 1] = key;
        }
    }

五、希尔排序(Shell Sort)

1.原理

先将整个数据序列分割成若干子序列分别进行直接插入排序,待整个序列中的记录基本有序时,再对全部数据进行依次直接插入排序,直至所有数据有序。

2.实现代码

public static long[] shellsort(long[] array,int gap){
        for (int i = 0; i < array.length-gap; i++) {
            //[0,i+gap)为有序区间,[i+gap,n)为无序区间
            long k=array[i+gap];
            //无序区间的第一个
            int j;
            for (j = i; j >0&&k<array[j] ; j=j-gap) {
                array[j+gap]=array[j];
            }
            array[j+gap]=k;
        }
        return array;
    }

六、堆排序(Heap Sort)

1.原理

堆排序利用堆这种近似完全二叉树的数据结构进行排序。堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。以最大堆为例,堆中的最大值总是位于根节点。首先将待排序的n个数据构造为大根堆,将顶端数据与末尾数据进行交换并将堆的尺寸减一,然后剩余n-1个数据再次构造为大根堆,再次交换,再次缩减,直至所有数据有序。

2.实现代码

public static void heapSort(long[] array) {
        // 建立大堆
        createBigHeap(array);
        for (int i = 0; i < array.length - 1; i++) {
            //交换之前的无序区间 [0, n - i)
            swap(array, 0, array.length - i - 1);
            // 交换之后的无序区间 [0, n - i - 1),元素个数 n - i - 1 个
            // 对堆的 [0] 进行向下调整,堆里的元素个数就是无序区间的元素个数
            shiftDown(array, array.length - i - 1, 0);
        }
    }
    private static void shiftDown(long[] array, int size, int index) {
        while (2 * index + 1 < size) {
            int maxIdx = 2 * index + 1;
            int right = maxIdx + 1;
            if (right < size && array[right] > array[maxIdx]) {
                maxIdx = right;
            }
            if (array[index] >= array[maxIdx]) {
                return;
            }
            swap(array, index, maxIdx);
            index = maxIdx;
        }
    }
    private static void createBigHeap(long[] array) {
        // 从最后一个元素的双亲开始
        for (int i = (array.length - 2) / 2; i >= 0; i--) {
            shiftDown(array, array.length, i);
        }
    }
    private static void swap(long[] array, int i, int j) {
        long t = array[i];
        array[i] = array[j];
        array[j] = t;
    }

七、归并排序(Merge Sort)

1.原理

归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序是一种稳定的排序方法。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序

2.实现代码

public static void mergeSort(long[] array) {
        mergeSortRange(array, 0, array.length);
    }
    //这里的 [from, to) 是左闭右开来表示区间的
    private static void mergeSortRange(long[] array, int from, int to) {
        int size = to - from;
        if (size <= 1) {
            return;
        }
        int mid = from + (size / 2);    
        //优先对左 [from, mid) 和右 [mid, to) 两个小区间先进行排序(使用同样的方式处理:分治思想)
        mergeSortRange(array, from, mid);
        mergeSortRange(array, mid, to);        
        //有了两个分别各自有序的小区间 [from, mid) 和 [mid, to)
        //通过一定的方式,将 [from, mid) [mid, to) 合并到 [from, to) 都是有序的
        //两个有序数组区间合并到一个有序数组区间(需要结果放回原地去)
        merge(array, from, mid, to);
    }
    private static void merge(long[] array, int from, int mid, int to) {
        // 先计算出来额外空间需要多个,计算两个区间加起来多少个元素
        int size = to - from;
        // 申请一个额外的数组作为临时保存的地方
        long[] other = new long[size];
        int left = from;    // 左边小区间的下标
        int right = mid;    // 右边小区间的下标
        int dest = 0;       // 临时空间的下标
        // 只要左右两个小区间还有元素要参与比较
        while (left < mid && right < to) {
            if (array[left] <= array[right]) {
                other[dest++] = array[left++];
            } else {
                other[dest++] = array[right++];
            }
        }
        // 其中一个区间的元素取完了,另一个区间里一定还有元素,再把剩余的元素,统统放入 other
        while (left < mid) {
            other[dest++] = array[left++];
        }
        while (right < to) {
            other[dest++] = array[right++];
        }
        // 把 other 中的有序元素,复制回 array 中,要注意下标的问题
        for (int i = 0; i < size; i++) {
            array[from + i] = other[i];   
        }
    }

八、桶排序(Bucket Sort)

桶排序属于计数排序的升级强化版,同时利用了分治的思想,将待排数据划分到一定数量的有序的桶里,然后再对每个桶中的数据进行排序(桶排序的稳定性取决于桶内排序算法是否稳定),最后再将各个桶里的数据有序的合并到一起。最理想的情况下,输入数据可以被均匀的分配在每一个桶中,时间复杂度可以降到O(n);最坏的情况为所有数据在同一个桶中进行排序,且使用了复杂度较高的排序算法,此时时间复杂度会变为O(n²)。为了使桶排序更加高效,需要做到以下两点:①在额外空间充足的情况下,尽量增加桶的数量。②使用的映射函数能够将输入的 N 个数据均匀的分配到 K 个桶中。


java中的排序.ppt 立即下载

相关推荐

内部排序算法资料(PPT+java代码)

内部排序算法资料(PPT+java代码)

十大经典排序算法总结(Java语言实现)

最近在看排序算法,对此做个总结。 参考文章: https://www.cnblogs.com/onepixel/articles/7674659.html https://www.cnblogs.com/guoyaohua/p/8600214.html 一、算法的分类 1、概念 将杂乱无章的数据元素,通过一定的方法按关键字顺序排列的过程叫做排序。 2、分类 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。 ...

wang的博客 2万+

java 冒泡排序法 PPT文档

java 冒泡排序法 PPT文档java 冒泡排序法 PPT文档java 冒泡排序法 PPT文档java 冒泡排序法 PPT文档

Java 中的排序算法详解

本文介绍了Java中常见的六种排序算法:冒泡排序、选择排序、插入排序、快速排序、归并排序和希尔排序。每种算法都包含原理说明、Java实现代码和优缺点分析。基础排序算法(冒泡、选择、插入)实现简单但效率较低,适合小规模数据;高级算法(快速、归并、希尔)更适合大规模数据,其中快速排序平均效率高,归并排序稳定但需要额外空间,希尔排序是插入排序的改进版。文章建议初学者掌握这些算法原理,以便更好地理解和使用Java内置的排序方法。

Java孩子的博客 2411

常用的排序算法(java实现),附带一个PPT动画演示、详解了其中三种

1. 一个PPT 用动画演示了 插入排序,直接插入排序,希尔排序,附带讲解。 2. 附带其他几种常用排序的java实现的源码。 3. PPT 还是简洁、美观的,可用作模板。

MAX30102心率血样模块在STM32F103芯片的程序说明

我希望你已经安装好了Keil MDK5这个软件,也安装了M3内核,可以编译一些STM32F103的一些项目下载程序后步骤: 1-按照下图找到IIC.uvprojx并打开(途中唯一绿色那个图标) 2-编译一次 3-确保0错误,0警告,下图所示 4-点击目标选项,然后找到STM32F103C8,再点debug–CMSIS****(我实际用的JTAG,用不了,选择这个CMSIS****即可)下图所示 5-下图所示,看看你的串口找到了没,找到了就点左下角的OK 6-按图上传到开发板 7-MAX30102接线方法

weixin_51357422的博客 5801

java排序算法精讲

java实现排序算法

杨思默 1万+

Windows系统监控实战:Grafana+Prometheus+node_exporter配置全攻略

本文提供了一套完整的Windows系统监控解决方案,详细介绍了如何使用Grafana、Prometheus和node_exporter(Windows版为windows_exporter)构建可视化监控平台。从环境准备、组件安装配置,到数据可视化与常见问题排查,手把手指导您实现从数据采集到仪表盘展示的全过程,帮助您从被动救火转向主动预警,有效保障Windows服务器稳定运行。

assembly8low的博客 247

十大经典排序算法——java语言

一、冒泡排序 二、选择排序 三、插入排序 四、希尔排序 五、归并排序 六、快速排序 七、堆排序 八、计数排序 九、桶排序 十、基数排序

weixin_56781779的博客 7037

计算机考研复试面试常问问题 数据结构篇(下)

计算机考研复试面试常问问题 数据结构篇(下) 使用前需知(拒绝白嫖,如果对你有帮助,你只需点个赞就行): 注意:有人在闲鱼上盗卖我的资料,而且还有很多同学买了,请各位擦亮双眼,我是整理出来免费分享给大家的! 大家请多点赞和评论,这样后面的同学更容易百度到,不至于被人盗卖,我就不加水印影响大家使用了! 第一次整理,度不好控制,有不好的地方希望大家理解,后面可能会改进,造福今年之后的同学们! ...

程序员宝藏的博客 1万+

手把手带你完成基于UNet的医学图像分割系统设计与实现,UNet网络架构讲解,UNet复现,使用vibe coding工具,开发一个完整系统,包含完整源码

哈喽,大家好,这里是落花不写码,本次教程讲一下 U-Net 分割篇,U-Net 它是一篇 2015 年发表的论文,那为什么到现在还需要讲呢?因为后续讲到 GAN、扩散模型时候是离不开 U-Net 架构的,所以今天先带大家使用 U-Net 模型完成一些图像分割。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 868

JAVA排序算法有那些

Java排序算法种类繁多,它们各自有着不同的特点和适用场景。我们可以将这些排序算法分为内置的排序方法和自定义实现的排序算法,其中自定义实现的排序算法又可以分为:比较排序和非比较排序。 Java标准库中的方法非常高效,并且针对不同类型的数组使用了不同的优化算法。对于原始类型数组(如, 等),采用了一种称为双轴快排(Dual-Pivot Quicksort)的算法。而对于对象数组(实现了接口或提供了的对象数组),则通常使用归并排序(Timsort)。对于小数组,它会切换到插入排序排序。:用于对接口

m0_50742275的博客 1402

《我的Classic Platform AUTOSAR之路》 BSWM 模式管理(二)ESH

只有 PostRun 和 wakeup 才能切换到 RUN,其他状态需要先切换到 wakeup 模式。进入 RUN 模式需要打开通信 allow,退出 Run 需要 disable 通信 allow。Prepareshut 与 dem_shutdown 绑定,如果没有 dem 配置,不会生成。除了 Init 模式下,其他模式下都要检查 ECU 的唤醒源和通信 pending 需求。与 ECUM 相关,整个 ECU 状态管理的状态机制。postrun 可以不配置,需要根据自己的需求使能。

libuping2023的博客 964

Java排序算法

Java排序算法一 文章目录Java排序算法一前言一、冒泡排序二、选择排序三、插入排序四、快速排序 前言 Java小白分享学习算法 一、冒泡排序 冒泡排序(Bubble Sort)就是把小的元素往前调或者把大的元素往后调从而实现从小到大的排序。 依次比较相邻的两个元素大小,若前一个元素大于后一个元素,则交换两个元素,每次比较一轮将最大的一个元素归位(即放到最后)。 import java.util.Arrays; /*冒泡排序*/ public class example1 { public

sinat_56381539的博客 8406

如何用 Claude Code 阅读和理解陌生代码

摘要: 在接手陌生代码时,Claude Code能显著提升理解效率。核心策略是结构化拆解而非逐行阅读: 从整体入手:先扫描目录结构、定位核心模块,建立项目地图; 聚焦关键路径:通过数据流追踪、异常逻辑分析,识别技术债与风险点; 规避常见错误:避免抽象提问或一次性提交全部代码,应分模块精准提问; 高阶应用:可生成逻辑分层图、标记高复杂度区域,甚至定制阅读顺序。 最终目标是通过结构优先的提问策略,将理解周期从数天压缩至数小时。

sg_knight的专栏 1019

如何在不牺牲精度的前提下,把 YOLOv11 压缩到 Jetson 能跑的程度

YOLOv11 在目标检测任务中具备较强的准确性与多尺度鲁棒性,但其原始模型参数规模与计算量,对边缘设备来说并不友好,特别是面向 Jetson 这类资源受限的推理平台。本文基于实际部署场景,逐步拆解从结构层级改造、剪枝策略制定、量化导出流程,到 Jetson TensorRT 推理落地全过程。在不牺牲主干精度的前提下,最终实现 YOLOv11 推理延迟缩短 3 倍、模型体积压缩 4 倍、mAP 损失控制在 1% 以内的轻量化优化结果,并总结出一条可复用的工程路径,供工业界与边缘侧模型部署开发者参考。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 2425

排序算法Java实现

算法最好最坏平均空间稳定思想注意事项冒泡O(n)O(n2n^2n2O(n2n^2n2O(1)Y比较最好情况需要额外判断选择O(n2n^2n2O(n2n^2n2O(n2n^2n2O(1)N比较交换次数一般少于冒泡堆O(nlognnlognnlognO(nlognnlognnlognO(nlognnlognnlognO(1)N选择堆排序的辅助性较强,理解前先理解堆的数据结构插入。

m0_74267125的博客 1301

基于STM32设计的计算器(实现基本运算)

当前文章介绍的是STM32+LCD触摸屏设计的一个触摸计算器功能,实现基本的加减乘除,二进制转换显示等功能。LCD屏使用的是3.5寸带触摸屏的显示屏,方便操作屏幕,MCU采用STM32F103ZET6。

8817

java排序算法总结

java排序算法总结 排序,这是一个很古老但是又很经典的问题,世界上有很多中优秀排序算法的实现,在这里,我总结了其他比较常用的几种排序算法 1.java排序算法一览 冒泡排序和基数排序 桶排序和计数排序 归并排序和快速排序 堆排序 插入排序和希尔排序 2.分类 3.比较 1.时间复杂度比较 算法 乱序时间复杂度 有序时间复杂度 插入排序 O(N^2) O(N) 希尔排序 ...

kevin的博客 3228

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

排序算法——八种常见排序算法的简单介绍和JAVA代码实现

本文进行了八种常见排序算法(冒泡,快排,插入,希尔,归并,基数,选择,堆排序)的简单介绍和JAVA代码实现

qq_65754164的博客 1260

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java各种排序算法

Java各种排序算法 1)分类: 1)插入排序(直接插入排序、希尔排序) 2)交换排序(冒泡排序、快速排序) 3)选择排序(直接选择排序、堆排序) 4)归并排序 5)分配排序(箱排序、基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序。 1)选...

shulin_success的专栏 460

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

java 合并排序算法_Java 程序实现合并排序算法

Java 程序实现合并排序算法在此示例中,我们将学习在Java中执行合并排序算法。在学习Java中的合并排序算法之前,请确保您了解合并排序算法的工作原理。示例:实现合并排序算法的Java程序示例importjava.util.Arrays;//Java中的合并排序classMain{//将两个子数组L和M合并为数组voidmerge(intarray[],intp,intq,i...

weixin_30395665的博客 1027

Java 选择排序算法

简介 前一章我们说了 Java 冒泡排序算法 ,这章我们来学习一下选择排序,老规矩,我们带着问题去学习,这样能更快的熟悉和掌握,学习如下: 1、选择排序的定义 2、选择排序的思路 3、代码实现 1.选择排序的定义 选择排序算法:基本思路是为每一个位置选择当前最小的元素。 2、选择排序的思路 将第一个值看成最小值 然后和后续值进行比较,找出最小值和下标,交换本次遍历的起始值和最小值 直至完成第(n-1)个位置的元素选择 说明:每次遍历的时候,将前面找出的最小值,看成一个有序的列表,后面的看成无序的列表,

ZengTao 514

Java实现十大排序算法

十大排序算法:插入、冒泡、选择、快速、归并、堆、基数、希尔、计数、桶、

galaxyou的博客 2224

Java排序算法引言

Java排序算法引言 排序就是将一组对象按照某种逻辑顺序重新排列的过程。 比较排序算法优劣的两个重要指标就是时间复杂度及空间复杂度,基于比较的排序算法时间复杂度不会小于N lgN。 重写的compareTo方法应该满足一下三个原则。

进击的考拉 330

Java实现选择排序算法

package chapter_01; /** * @ClassName: 选择排序算法 * @Description: * @Author * @Date * @Version 1.0 */ public class Test { public static void main(String[] args) { //静态数组 int[] arr = {6,2,1,5,3,4}; for (int i = 0; i < arr.

Json_book的博客 144
上一篇: Iterable、Collection、List 的常见方法签名以及含义
下一篇: 【java】leetcode690.员工的重要性
青春无敌美少
博客等级 码龄6年 165粉丝 33原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值