java实现排序算法(上)

排序算法

冒泡排序

时间和空间复杂度

要点

  • 每轮冒泡不断地比较比较相邻的两个元素,如果它们是逆序的,则需要交换它们的位置
  • 下一轮冒泡,可以调整未排序的右边界,减少不必要比较

代码

public static int[] test(int[] array) {
    // 外层循环控制遍历次数
    for (int i = 0; i < array.length; i++) {
        // 内层循环控制每轮比较和交换
        for (int j = 0; j < array.length - i - 1; j++) {
            // 比较相邻两元素大小
            if (array[j] > array[j + 1]) {
                // 交换元素位置
                int temp = array[j + 1];
                array[j + 1] = array[j];
                array[j] = temp;
            }
        }
    }
    // 返回排序后的数组
    return array;
}

测试结果

public static void main(String[] args) {
        int[] array = {3,1,2,4,7,9};
        int[] ary = test(array);
        System.out.println(Arrays.toString(ary));
    }

选择排序

时间和空间复杂度

要点

  • 每一轮选择,找出最大(最小)的元素,并把它交换到合适的位置

代码

public static int[] test(int[] array) {
        // 外循环遍历数组元素
        for (int i = 0; i < array.length; i++) {
            // 内循环从当前元素的下一个元素开始比较
            for (int j = i+1; j < array.length; j++) {
                // 如果前一个元素大于后一个元素,交换它们的位置
                if(array[i] > array[j]){
                    int temp = array[j];
                    array[j] = array[i];
                    array[i] = temp;
                }
            }
        }
        // 返回排序后的数组
        return array;
    }

测试结果

public static void main(String[] args) {
        int[] array = {3,1,2,4,7,9};
        int[] ary = test(array);
        System.out.println(Arrays.toString(ary));
    }

堆排序

时间和空间复杂度

要点(如果这里看不懂的话,是需要去了解大顶堆这个数据结构的)

  • 建立大顶堆
  • 每次将堆顶元素最大值,交换到末尾,调整堆顶元素,让它重新符合大顶堆特性

代码

import java.util.Arrays;

public class Heap {
    int[] array; // 存储堆元素的数组
    int size;    // 堆的大小

    public Heap(int capacity) {
        this.array = new int[capacity];
    }

    public Heap(int[] array){
        this.array = array;
        this.size = array.length;
        heapify(); // 调用堆化方法,构建堆
    }

    /**
     * 建立堆
     */
    private void heapify() {
        // 建立堆的过程实际上是找到最后一个非叶子节点
        for (int i = size/2-1; i >=0 ; i--) {
            // 接下来的循环中,i 是当前非叶子节点的索引
            down(i); // 对当前非叶子节点进行下潜操作,保证满足堆的性质
        }
    }

    // 下潜操作
    private void down(int i) {
        int left = i * 2 + 1; // 左子节点索引
        int right = left + 1; // 右子节点索引
        int max = i;          // 初始化最大值索引为当前节点

        // 判断左子节点是否存在且大于当前节点
        if (left < size && array[left] > array[max]) {
            max = left;
        }
        // 判断右子节点是否存在且大于当前节点
        if (right < size && array[right] > array[max]) {
            max = right;
        }

        if (max != i) {
            // 交换当前节点与最大值节点
            swap(max, i);
            // 递归调用下潜操作,保证交换后的子树仍然满足堆的性质
            down(max);
        }
    }

    // 交换数组中两个位置的元素
    private void swap(int a, int b) {
        int temp = array[a];
        array[a] = array[b];
        array[b] = temp;
    }
}

public static void main(String[] args) {
    int[] array = {1,2,3,4,5,6,7};
    Heap heap = new Heap(array);
    
    // 堆排序
    while (heap.size > 1) {
        // 将堆顶元素与堆尾元素交换
        heap.swap(0, heap.size - 1);
        // 堆大小减一
        heap.size--;
        // 对交换后的堆顶元素进行下潜操作,保证仍然满足堆的性质
        heap.down(0);
    }
    
    System.out.println(Arrays.toString(heap.array));
}

测试结果

插入排序

时间和空间复杂度

要点

  • 将数组分为两部分[0----low-1][low----a.length-1]
    • 左边[0-----low-1]是已排序部分
    • 右边[low------a.length-1]是未排序部分
  • 每次从未排序区域取出low位置的元素,插入到已排序区域

代码

  

public static int[] test(int[] array) {
        // 外层循环,从数组第二个元素开始
        for (int low = 1; low < array.length; low++) {
            // 记录当前元素值
            int t = array[low];
            // 从当前元素的前一个位置开始向前查找插入位置
            int i = low - 1;
            while (i >= 0 && t < array[i]) {
                // 如果当前元素小于已排序元素,将已排序元素后移一位
                array[i + 1] = array[i];
                i--;
            }
            // 找到插入位置,将当前元素插入
            if (i != low - 1) {
                array[i + 1] = t;
            }
        }
        // 返回排序后的数组
        return array;
    }

测试结果

public static void main(String[] args) {
        int[] array = {3,1,2,4,7,9};
        int[] ary = test(array);
        System.out.println(Arrays.toString(ary));
    }

希尔排序

时间和空间复杂度

要点

  • 简单来说,就是分组实现插入,魅族元素间隙称为hap
  • 每轮排序之后gap逐渐变小,直到gap为1完成排序
  • 对插入排序的优化,让元素更快地交换到最终位置

代码

public static int[] test(int[] array) {
        // 此时的gap就是间隙
        for (int gap = array.length >> 1; gap >= 1 ; gap = gap >> 1) {
            for (int low = gap; low < array.length ; low++) {
                // 记录当前位置的元素值
                int t = array[low];
                // 初始化比较位置为当前位置的前一个位置
                int i = low - gap;
                // 当比较位置合法且当前元素值小于比较位置的元素值时进行插入排序
                while (i >= 0 && t < array[i]){
                    // 将比较位置的元素往后移动gap个位置
                    array[i + gap] = array[i];
                    // 更新比较位置为前一个gap位置
                    i -= gap;
                }
                // 如果实际插入位置不是当前位置的前一个gap位置,则进行插入操作
                if (i != low - gap){
                    array[i + gap] = t;
                }
            }
        }
        // 返回排序后的数组
        return array;
    }

测试结果

public static void main(String[] args) {
        int[] array = {3,1,2,4,7,9};
        int[] ary = test(array);
        System.out.println(Arrays.toString(ary));
    }

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

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

相关文章

【DDD】学习笔记-领域服务

聚合的三个问题 按照面向对象设计原则&#xff0c;需要将“数据与行为封装在一起”&#xff0c;避免将领域模型对象设计为贫血对象。如此一来&#xff0c;聚合内的实体与值对象承担了与其数据相关的领域行为逻辑。聚合满足了领域概念的完整性、独立性与不变量&#xff0c;体现…

小白水平理解面试经典题目LeetCode 1025 Divisor Game【动态规划】

1025 除数游戏 小艾 和 小鲍 轮流玩游戏&#xff0c;小艾首先开始。 最初&#xff0c;黑板上有一个数字 n 。在每个玩家的回合中&#xff0c;该玩家做出的动作包括&#xff1a; 选择任意 x&#xff0c;使 0 < x < n 和 n % x 0 。将黑板上的数字 n 替换为 n - x 。 此…

【HarmonyOS】【DevEco ohpm ERROR: NOTFOUND package “@ohos/hypium“如何解决

参考 &#xff1a;&#xff08;无效&#xff09; 华为开发者论坛 DevEco创建项目时的错误解决_6 月 优质更文活动_路北路陈_InfoQ写作社区 解决&#xff1a; HormonyOS-DevEco Studio新建空项目ERROR解决_oh_modules\ohos\hypium-CSDN博客 将 .ohpm文件夹中的hypium文件夹复…

如何引导llm为自己写prompt生成剧本

如何使用写prompt让你自己生一个狗血修仙穿越短剧&#xff0c;且短剧有趣生动让人流连忘返 好的&#xff0c;我会尝试编写一个狗血修仙穿越短剧的prompt&#xff0c;以激发你的想象力&#xff0c;让你创作出一个既有趣又生动的短剧。以下是我的prompt&#xff1a; 标题&#x…

gem5学习(23):经典缓存——Classic Caches

目录 一、Interconnects 1、Crossbars 二、Debugging 默认缓存是一个带有MSHR&#xff08;未命中状态保持寄存器&#xff09;和WB&#xff08;写缓冲区&#xff09;的非阻塞缓存&#xff0c;用于读取和写入未命中。缓存还可以启用预取&#xff08;通常在最后一级缓存中&…

java.sql.SQLException: No operations allowed after statement closed.

背景 某天下午&#xff0c;客服反馈线上服务出现问题&#xff0c;不能分配了。于是我登录到系统上&#xff0c;进行同样的操作发现也不行。当然同时我已经登录到服务器打开了日志&#xff0c;发现报错了&#xff0c;下面就是日志的错误信息&#xff1a; java.sql.SQLExceptio…

Swagger-的使用

Swagger-的使用 前言效果1、相关依赖2、相关注解2.1 Tag设置整个类的名称和详情2.2 Operation描述具体的方法2.3 Parameter 描述参数2.4Schema 为属性添加注释 3、Docket配置3.1通过gropeediopenapi进行分组3.2 通过docsOpenApi设置 前言 在我们和前端进行交互的时候&#xff…

ChatGPT高效提问—prompt实践(白领助手)

ChatGPT高效提问—prompt实践&#xff08;白领助手&#xff09; ​ 随着社会的不断发展&#xff0c;白领的比例越来越高。白领的工作通常较为繁忙&#xff0c;需要管理复杂的项目。工作量大、要求高、任务紧急&#xff0c;时间分配不当部分可能导致工作效率低下&#xff0c;任…

【AGI视频】Sora的奇幻之旅:未来影视创作的无限可能

在五年后的未来&#xff0c;科技的发展为影视创作带来了翻天覆地的变化。其中&#xff0c;Sora视频生成软件成为了行业的翘楚&#xff0c;引领着全新的创作潮流。Sora基于先进的Transformer架构&#xff0c;将AI与人类的创造力完美结合&#xff0c;为观众带来了前所未有的视听盛…

OpenAI:Sora视频生成模型技术报告(中文)

概述 视频生成模型作为世界模拟器 我们探索视频数据生成模型的大规模训练。具体来说&#xff0c;我们在可变持续时间、分辨率和宽高比的视频和图像上联合训练文本条件扩散模型。我们利用transformer架构&#xff0c;在视频和图像潜在代码的时空补丁上运行。我们最大的模型Sor…

使用倒模耳机壳UV树脂胶液制作HIFI耳机隔音降噪耳机壳有哪些缺点?

虽然使用倒模耳机壳UV树脂胶液制作HIFI耳机隔音降噪耳机壳有很多优点&#xff0c;但也存在一些缺点和需要注意的事项&#xff1a; 技术要求高&#xff1a;制作过程需要一定的技术和经验&#xff0c;如模具制作、树脂混合和填充等。如果没有足够的经验和技巧&#xff0c;可能会…

浅谈js事件机制

事件是什么&#xff1f;事件模型&#xff1f; 原始事件模型&#xff08;DOM0级&#xff09; HTML代码中指定属性值&#xff1a;在js代码中指定属性值&#xff1a;优点&#xff1a;缺点&#xff1a; IE 事件模型DOM2事件模型 对事件循环的理解 宏任务&#xff08;Macrotasks&…

WSL安装Ubuntu22.04,以及深度学习环境的搭建

安装WSL 安装 WSL 2 之前&#xff0c;必须启用“虚拟机平台”可选功能。 计算机需要虚拟化功能才能使用此功能。 以管理员身份打开 PowerShell 并运行&#xff1a; dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart下载 Linux 内核更…

【开源】SpringBoot框架开发服装店库存管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 服装档案模块2.4 服装入库模块2.5 服装出库模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 角色表3.2.2 服装档案表3.2.3 服装入库表3.2.4 服装出库表 四、系统展示五、核心代码5.…

C++学习Day05之递增运算符重载

目录 一、程序及输出1.1 前置重载1.2 后置重载 二、分析与总结 一、程序及输出 1.1 前置重载 #include<iostream> using namespace std;class MyInter {friend ostream& operator<<(ostream& cout, MyInter& myInt); public:MyInter(){m_Num 0;}//前…

CSS 圆形的时钟秒针状的手柄绕中心点旋转的效果

<template><!-- 创建一个装载自定义加载动画的容器 --><view class="cloader"><!-- 定义加载动画主体部分 --><view class="clface"><!-- 定义类似秒针形状的小圆盘 --><view class="clsface"><!-…

实战打靶集锦-024-Seppuku

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 FTP探查4.2 80端口探查4.3 探查smb4.4 探查7080端口httpd4.5 探查Apache4.6 探查8088端口的LiteSpeed4.7 大海捞…

【自然语言处理】:实验4布置,预训练语言模型实现与应用

清华大学驭风计划 因为篇幅原因实验答案分开上传&#xff0c;自然语言处理专栏持续更新中&#xff0c;期待的小伙伴敬请关注 有任何疑问或者问题&#xff0c;也欢迎私信博主&#xff0c;大家可以相互讨论交流哟~~ 案例简介 2018年&#xff0c;Google提出了预训练语言模型BE…

深度学习之pytorch实现线性回归

度学习之pytorch实现线性回归 pytorch用到的函数torch.nn.Linearn()函数torch.nn.MSELoss()函数torch.optim.SGD() 代码实现结果分析 pytorch用到的函数 torch.nn.Linearn()函数 torch.nn.Linear(in_features, # 输入的神经元个数out_features, # 输出神经元个数biasTrue # 是…

Android 发布蒲公英平台自动更新

蒲公英官网&#xff1a;https://www.pgyer.com/ 首先弄明白蒲公英平台的SDK更新机制&#xff1a;蒲公英 - 文档中心 - SDK 自动更新机制 (pgyer.com) 下面直接开始代码操作 1.添加蒲公英maven库 maven { url "https://raw.githubusercontent.com/Pgyer/mvn_repo_pgyer…