java排序算法精讲

news2025/1/14 0:51:20

排序算法

  • 概要
  • 一、冒泡排序
    • 概念
      • 实现步骤
    • 代码
  • 二、选择排序
    • 概念
      • 实现步骤
    • 代码
  • 三、插入排序
    • 概念
      • 实现步骤
    • 代码
  • 四、快速排序
    • 概念
      • 实现步骤
    • 代码
  • 五、归并排序
    • 概念
      • 实现步骤
    • 代码
  • 六、堆排序
    • 概念
      • 实现步骤
    • 代码
  • 总结
    • 以二维表表现出各个排序的关系

概要

    Java是一种面向对象的编程语言,广泛应用于各种软件开发领域。其中,排序算法是Java程序员必须熟练掌握的技能之一。排序是将一组无序的数据按照一定规则重新排列的过程,使其变成有序的数据。在Java中,有许多种排序算法可供使用,本文将详细介绍Java中的排序算法及其实现。

一、冒泡排序

概念

    冒泡排序是一种简单的排序算法。它的基本思想是将待排序的元素依次比较相邻的两个元素,如果前一个元素大于后一个元素,则交换它们的位置,直到整个序列都有序。冒泡排序的实现比较简单,但是当数据量较大时,效率较低。

实现步骤

  1. 从待排序的数列中,从第一个元素开始,依次比较相邻的两个元素,如果前面的元素比后面的元素大,则交换这两个元素的位置。
  2. 对数列中的每一对相邻元素进行比较,重复执行以上步骤,直到没有任何一对元素需要交换为止。
  3. 最终,数列中的所有元素按照从小到大的顺序排列。

代码

冒泡排序的Java代码实现如下:

public static void bubbleSort(int[] arr) {
    int n = arr.length;
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

二、选择排序

概念

    选择排序是一种简单的排序算法。它的基本思想是每次从未排序的数据中选取最小(或最大)的数,将其放到已排序数据的末尾,直到整个序列都有序。选择排序的实现比冒泡排序稍微复杂一些,但是效率要高一些。

实现步骤

  1. 遍历整个序列,找到最小的元素。
  2. 将最小元素和序列的第一个元素交换位置。
  3. 在剩余的未排序序列中,继续执行步骤 1 和 2,直到序列有序。

代码

选择排序的Java代码实现如下:

public static void selectionSort(int[] arr) {
    int n = arr.length;
    for (int i = 0; i < n - 1; i++) {
        int minIndex = i;
        for (int j = i + 1; j < n; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }
        int temp = arr[minIndex];
        arr[minIndex] = arr[i];
        arr[i] = temp;
    }
}

三、插入排序

概念

    插入排序是一种简单的排序算法。它的基本思想是将待排序的元素依次插入到已排序的数据中,使其保持有序。插入排序的实现比选择排序稍微复杂一些,但是效率要高一些。

实现步骤

  1. 从第一个元素开始,该元素可以认为已经被排序
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
  5. 将新元素插入到该位置中
  6. 重复步骤2-5,直到排序完成

代码

插入排序的Java代码实现如下:

public static void insertionSort(int[] arr) {
    int n = arr.length;
    for (int i = 1; i < n; i++) {
        int key = arr[i];
        int j = i - 1;
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = key;
    }
}

四、快速排序

概念

    快速排序是一种高效的排序算法。它的基本思想是选取一个基准元素,将数组分成两个部分,其中一部分中的元素都小于基准元素,另一部分中的元素都大于基准元素。然后对这两个部分分别进行递归排序,最终将整个序列排好序。快速排序的实现比前面三种排序算法要复杂一些,但是效率要高很多。

实现步骤

  1. 选取一个基准元素,通常选择第一个元素或者最后一个元素。
  2. 将序列中的元素按照基准元素分为两部分,小于基准元素的放在左边,大于基准元素的放在右边。
  3. 对左右两部分递归地进行快速排序,直到序列不可再分。
  4. 合并左右两部分,得到最终的有序序列。

代码

快速排序的Java代码实现如下:

public static void quickSort(int[] arr, int left, int right) {
    if (left < right) {
        int pivotIndex = partition(arr, left, right);
        quickSort(arr, left, pivotIndex - 1);
        quickSort(arr, pivotIndex + 1, right);
    }
}

public static int partition(int[] arr, int left, int right) {
    int pivot = arr[right];
    int i = left - 1;
    for (int j = left; j < right; j++) {
        if (arr[j] < pivot) {
            i++;
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    int temp = arr[i + 1];
    arr[i + 1] = arr[right];
    arr[right] = temp;
    return i + 1;
}

五、归并排序

概念

    归并排序是一种高效的排序算法。它的基本思想是将待排序的序列分成两部分,分别对这两部分进行递归排序,最后将两个有序子序列合并成一个有序序列。归并排序的实现比前面四种排序算法要复杂一些,但是效率也很高。

实现步骤

  1. 将待排序数组从中间位置一分为二,分别对左半部分和右半部分进行递归排序,直到每个子数组只有一个元素为止。
  2. 将排好序的左半部分和右半部分合并起来。合并时,使用两个指针分别指向左半部分和右半部分的起始位置,比较两个指针所指向的元素大小,将较小的元素放入临时数组中,同时移动指针。当其中一个子数组的元素全部放入临时数组中后,将另一个子数组中剩余的元素依次放入临时数组中。
  3. 将临时数组中的元素复制回原数组的对应位置。

代码

归并排序的Java代码实现如下:

public static void mergeSort(int[] arr, int left, int right) {
    if (left < right) {
        int mid = (left + right) / 2;
        mergeSort(arr, left, mid);
        mergeSort(arr, mid + 1, right);
        merge(arr, left, mid, right);
    }
}

public static void merge(int[] arr, int left, int mid, int right) {
    int[] temp = new int[right - left + 1];
    int i = left, j = mid + 1, k = 0;
    while (i <= mid && j <= right) {
        if (arr[i] <= arr[j]) {
            temp[k++] = arr[i++];
        } else {
            temp[k++] = arr[j++];
        }
    }
    while (i <= mid) {
        temp[k++] = arr[i++];
    }
    while (j <= right) {
        temp[k++] = arr[j++];
    }
    for (int p = 0; p < temp.length; p++) {
        arr[left + p] = temp[p];
    }
}

六、堆排序

概念

    堆排序是一种高效的排序算法。它的基本思想是将待排序的序列构建成一个堆,然后依次将堆顶元素取出并调整堆,直到整个序列都有序。堆排序的实现比前面的排序算法要复杂一些,但是效率也很高。

实现步骤

  1. 将待排序的序列构建成一个大根堆(或小根堆),即每个节点的值都大于(或小于)其左右子节点的值。
  2. 取出堆顶元素(最大值或最小值),将其与堆的最后一个元素交换位置,然后将堆的大小减一。
  3. 对新的堆顶元素进行堆调整,使其重新成为一个大根堆(或小根堆)。
  4. 重复步骤 2 和步骤 3 直到堆的大小为 1,此时排序完成。

代码

堆排序的Java代码实现如下:

public static void heapSort(int[] arr) {
    int n = arr.length;
    for (int i = n / 2 - 1; i >= 0; i--) {
        heapify(arr, n, i);
    }
    for (int i = n - 1; i >= 0; i--) {
        int temp = arr[0];
        arr[0] = arr[i];
        arr[i] = temp;
        heapify(arr, i, 0);
    }
}

public static void heapify(int[] arr, int n, int i) {
    int largest = i;
    int left = 2 * i + 1;
    int right = 2 * i + 2;
    if (left < n && arr[left] > arr[largest]) {
        largest = left;
    }
    if (right < n && arr[right] > arr[largest]) {
        largest = right;
    }
    if (largest != i) {
        int temp = arr[i];
        arr[i] = arr[largest];
        arr[largest] = temp;
        heapify(arr, n, largest);
    }
}

总结

    本文介绍了Java中常见的排序算法,包括冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序。这些排序算法的实现虽然有所差异,但是它们都具有一定的规律和套路,掌握其中的一些核心思想和技巧对于Java程序员来说是非常重要的。当然,实际开发中,我们也可以选择使用Java中已经封装好的排序方法,如Arrays.sort()方法,来完成排序操作。

以二维表表现出各个排序的关系

在这里插入图片描述

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

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

相关文章

一篇文章带您区分GNSS欺骗模拟测试的两种方式

写在前面 注意&#xff1a;提供的设备与案例、使用指南等指导性文件是为了在测试环境中对接收机的抗干扰能力进行验证&#xff0c;而非出于欺骗或干扰真实环境中的GNSS信号的目的&#xff01;请确保通过线缆连接应用或暗室应用&#xff0c;若因为违规使用产生的任何法律后果和…

携带数据的Ajax POST请求

前端页面代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>发送ajax POST请求 看如何携带数据</title> <script type"text/javascript"> …

MES管理系统有什么功能?前期实施MES需要做些什么

MES系统是在制造业数字化的环境下&#xff0c;围绕生产制造执行而开发的一套生产管理系统。它以车间为管理核心&#xff0c;通过集成各信息系统&#xff0c;整合企业资源&#xff0c;实现从订单下达到产品完成的整个生产制造过程的数字化管理。 MES系统在实施前需要进行各种准备…

“UTONMOS吧”的出现,能否唤起百度贴吧曾经的辉煌?

百度贴吧&#xff0c;诞生于一个中文互联网尚且信息不足的时代&#xff0c;并建立起了一个庞大的社区。然而进入自媒体时代&#xff0c;贴吧这个大广场日渐冷清&#xff0c;2015年月活用户超过3亿&#xff0c;到2021年已不足4000万。 梗的流行&#xff0c;带动一大批人开始网上…

OpenShift 4 - KubeVirt 虚机使用的磁盘和卷

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在 OpenShift 4.12 环境中验证 文章目录 KubeVirt 虚机的磁盘和卷Disk 磁盘Volume 卷 磁盘和卷示例containerDisk 卷示例cloudInitNoCloud 卷示例dataVolume 卷示例基于容器镜像基于 qcow2 文件基于 DataSo…

放大招:三步搞定ChatGPT提示词,轻松写出高质量提问,最新经验分享

在撰写ChatGPT提示语的时候&#xff0c;有一个基本的三层结构&#xff0c;经过在工作和生活上的实践&#xff0c;有助于解决大多数不同类型的任务。 尤其在你的问题有点复杂&#xff0c;想不清楚要怎么问比较好的时候&#xff0c;通过三层结构&#xff0c;让我们有结构的提出问…

力扣简单题

目录 9、回文数 13、罗马数字转整数 14、最长公共前缀 20、有效的括号 58、最后一个单词的长度 66、加一 69、x的平方根 94、二叉树的中序遍历 100、相同的树 202、快乐数 205、同构字符串 242、有效的字母异位词 258、各位相加 268、丢失的数字 290、单词…

Github 使用教学

&#x1f4ad; 写在前面&#xff1a;本章我们将介绍 Git 的基本使用方法&#xff0c;包括注册 GitHub 账号、设置 Git、创建本地存储库、复制本地存储库、导入远程存储库、追加、提交、合并等常用操作。我们还会教你如何在 GitHub 上创建项目&#xff0c;使用 git clone 命令克…

盘“底座”,盘出新生意经

本文转自首席信息官 作者 徐蕊 导读 卖“底座”&#xff0c;这是一门新的生意&#xff0c;也是用友与友商差异化的商业竞争优势所在。 大型企业都在建“数智化底座” 有这样两类企业&#xff0c;他们截然不同&#xff0c;但在数智化的建设上殊途同归。 随着中国经济的发展&a…

SLAM论文速递:经典动态SLAM解析—(2021)DP-SLAM:面向动态环境的移动概率视觉SLAM—5.08(1)

论文信息 题目&#xff1a; DP-SLAM:A visual SLAM with moving probability towards dynamic environments DP-SLAM:面向动态环境的移动概率视觉SLAM论文地址&#xff1a; 发表期刊&#xff1a; 标签 语义分割几何约束、动态概率传播、 摘要 文中提出了一种基于稀疏特征的视觉…

DDD分层架构浅析

大家好&#xff0c;我是易安&#xff01;今天我们聊下DDD分层架构 微服务架构模型有好多种&#xff0c;例如整洁架构、CQRS和六边形架构等等。每种架构模式虽然提出的时代和背景不同&#xff0c;但其核心理念都是为了设计出“高内聚低耦合”的架构&#xff0c;轻松实现架构演进…

【P12】JMeter 准确的吞吐量定时器(Precise Throughput Timer)

&#xff08;1&#xff09;、测试计划右键 <<< 添加 <<< 定时器 <<< 准确的吞吐量定时器&#xff08;Precise Throughput Timer&#xff09; 目标吞吐量&#xff08;每个“吞吐期”的样本&#xff09;&#xff1a;15.0 吞吐量周期&#xff08;秒&a…

ArcGIS植被覆盖度计算与栅格计算

遥感&#xff0c;顾名思义就是遥远的感知。就是利用飞机、卫星等平台对地球进行观测并获取数据。这里的数据可以使光谱数据、磁场数据等。今天我们就用一个简单的例子来说明ArcGIS对遥感数据的处理&#xff0c;但是ArcGIS处理遥感并没有其他专业遥感软件如ENVI那样强大&#xf…

(转载)04.Matplotlib-文本注释数学表达式设置

1. matplotlib.pyplot.text 文本基本参数设置 2. matplotlib.pyplot.annotate 注释基本参数设置 Matplotlib 支持绘制 TeX 包含的数学符号。TeX 是一套功能强大、十分灵活的排版语言&#xff0c;它可以用来绘制文本、符号、数学表达式等。通过下表中的方法可以绘制出相应的内容…

Java基础学习(13)

Java基础学习 一、File1.1 File详情1.2 File常见的成员方法1.2.1 判断获取1.2.2 创建删除1.2.3 获取遍历 二、IO流2.1 IO流体系2.2 FileOutputStream2.2.1 FileOutputStream写数据的3种方式2.2.2 FileOutputStream换行写:2.2.3 FileOutputStream续写 2.3 FilelnputStream拷贝文…

Go语言中的流程控制语句

目录 流程控制语句 if语句 ifelse语句 switch语句 for循环 break语句 continue语句 goto语句 流程控制语句 if语句 在Go语言中&#xff0c;可以在if后面加上一段执行语句&#xff0c;执行语句也可以用作对if条件的判断。它的语法格式为&#xff1a; if a : conditio…

MySQL_3 数据库的“CRUD“

目录 一、添加数据 1.基本语法 : 2.代码演示 : 二、查找数据 1.基本语法 : 2.代码演示 : 3.查询中的计算 : 4.WHERE子句的扩展 : 5.排序查询 : 三、修改数据 1.基本语法 : 2.代码演示 : 四、删除数据 1.基本语法 : 2.代码演示 : 一、添加数据 1.基本语法 : INS…

吹爆,全网第一个手把手教你从零开始搭建Spring Cloud Alibaba的笔记

Spring Cloud Alibaba 是阿里巴巴提供的微服务开发一站式解决方案&#xff0c;是阿里巴巴开源中间件与 Spring Cloud 体系的融合。 Springcloud 和 Srpingcloud Alibaba 区别&#xff1f; SpringCloud&#xff1a; 部分组件停止维护和更新&#xff0c;给开发带来不便;SpringCl…

stm32103ZET6使用编码器(磁电增量式)

这里写目录标题 磁电增量式编码器介绍TIM定时器&#xff08;编码器接口模式&#xff09;一些用到的算法均值滤波冒泡排序&#xff08;从小到大&#xff09;一阶低通滤波 编码器测数代码编码器接口HAL库函数 正点原子的电机例程(原例程用的是stm32f407&#xff0c;我这里改成用s…

ClickHouse:对不同类型Join的支持

ClickHouse 是一个流行的开源实时分析数据库&#xff0c;旨在为需要在大量数据上进行超低延迟分析查询的用例提供最佳性能。为了在分析应用程序中实现最佳性能&#xff0c;通常需要将表组合在一起进行数据非规范化处理。扁平化表通过避免联接来帮助最小化查询延迟&#xff0c;以…