Java数据结构之选择排序算法的实现与优化

Java数据结构之选择排序算法的实现与优化

选择排序算法的原理

选择排序是一种简单直观的排序算法,它的基本思想是:从待排序的数据中选出最小的数,将其放在首位;再从剩余的数据中选出最小的数,放在已排序数据的末尾;以此类推,直到所有数据均已排序完毕。

选择排序的时间复杂度为O(n²),空间复杂度为O(1)。相比于其他排序算法,选择排序的代码实现简单、易于理解。

选择排序算法的实现

下面是选择排序算法的Java实现:

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

其中,外层循环用于控制排序次数,内层循环用于查找未排序数据中的最小值并记录其位置,然后将它和第i个元素交换位置。

选择排序算法的优化

尽管选择排序算法的时间复杂度为O(n²),但它依然可以通过一些优化技巧来提高效率,比如:

  1. 最小值和最大值一起获取:每次在遍历数组时,记录当前遍历的位置和数组中最小值和最大值的位置。当遍历结束时,将最小值和最大值放置在数组两端。
  2. 减少交换次数:每次找到最小值后,将其和第i个元素交换位置时,可以使用一个变量j记录最小值的位置,最后再和第i个元素交换位置。

下面是基于这些优化技巧的Java实现:

public static void advancedSelectionSort(int[] arr) {
    int len = arr.length;
    int minIndex, maxIndex, temp;
    for (int i = 0; i < len / 2; i++) {
        minIndex = i;
        maxIndex = i;
        for (int j = i + 1; j < len - i; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
            if (arr[j] > arr[maxIndex]) {
                maxIndex = j;
            }
        }
        if (minIndex != i) {
            temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
        if (maxIndex == i) {
            maxIndex = minIndex; // 防止maxIndex和minIndex重复
        }
        if (maxIndex != len - i - 1) {
            temp = arr[len - i - 1];
            arr[len - i - 1] = arr[maxIndex];
            arr[maxIndex] = temp;
        }
    }
}

示例说明

下面是一个使用选择排序算法对整型数组进行排序的示例:

int[] arr = new int[] { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5 };
selectionSort(arr);
System.out.println(Arrays.toString(arr));
// 输出:[1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]

这段代码首先创建了一个包含11个元素的整型数组,然后使用选择排序算法对其进行排序,最后输出排序结果。

下面是使用优化后的选择排序算法对整型数组进行排序的示例:

int[] arr = new int[] { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5 };
advancedSelectionSort(arr);
System.out.println(Arrays.toString(arr));
// 输出:[1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]

这段代码与前一个示例大致相同,只是使用了优化后的选择排序算法进行排序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java数据结构之选择排序算法的实现与优化 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • bool当成函数参数错误理解

    当我们需要在函数的参数中使用布尔类型时,有时会犯一些容易混淆的错误。其中一个常见的错误是将bool类型当成了一个函数参数来使用。具体来说,这种错误的表现形式是将一个bool类型的变量名作为实参,传递给了一个接受一个函数指针或函数对象的函数。 这种错误的原因在于bool类型的变量可以隐式转换为函数指针或函数对象。具体来说,当一个bool类型的变量被用在需要一个…

    Java 2023年5月26日
    00
  • JAVA如何获取jvm和操作系统相关信息

    Java程序可以通过System类中提供的一些方法获取JVM和操作系统相关信息。具体步骤如下: 获取JVM相关信息: (1)获取JVM版本信息 Java程序可以通过System类的getProperty方法获取Java运行时环境JRE的版本信息,使用的是java.version这个参数。 示例代码: String javaVersion = System.g…

    Java 2023年5月24日
    00
  • java(jdk)环境变量配置(XP、win7、win8)图文教程详解

    关于Java环境变量配置的详细攻略,我将为你提供如下步骤: 1. 下载安装JDK(Java Development Kit) 在安装JDK之前,请确认已经下载了适合你操作系统版本的JDK安装程序。可以在Oracle官网上下载最新版的JDK。 安装过程就是一般的软件安装过程,按照提示一步步操作即可。 2. 配置JAVA_HOME环境变量 安装完JDK后,我们需…

    Java 2023年5月24日
    00
  • Intellij IDEA导入JAVA项目并启动(图文教程)

    下面详细讲解一下“Intellij IDEA导入JAVA项目并启动(图文教程)”的完整攻略。 1. 下载Intellij IDEA 首先,我们需要下载安装Intellij IDEA,可以到官网(https://www.jetbrains.com/idea/)下载安装包并进行安装。 2. 导入JAVA项目 在Intellij IDEA中选择File ->…

    Java 2023年5月26日
    00
  • springMVC几种页面跳转方式小结

    SpringMVC几种页面跳转方式小结 在SpringMVC中,有多种方式可以实现页面跳转。本文将介绍其中的几种方式,并提供示例说明。 方式一:使用redirect 使用redirect可以实现页面的重定向。在控制器方法中,我们可以使用”redirect:”前缀来指定重定向的URL。下面是一个示例的控制器方法: @GetMapping("/redi…

    Java 2023年5月17日
    00
  • 设计模式系列之组合模式及其在JDK和MyBatis源码中的运用详解

    请看下面的完整攻略: 设计模式系列之组合模式及其在JDK和MyBatis源码中的运用详解 什么是组合模式 组合模式(Composite Pattern),也叫部分-整体模式,是一种结构型设计模式。通过将对象组合成树形结构,以表示“整体-部分”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性,即将对象的组合与单个对象的使用同等对待。 组合模式由…

    Java 2023年5月20日
    00
  • Spring data jpa的使用与详解(复杂动态查询及分页,排序)

    下面是关于“Spring data jpa的使用与详解(复杂动态查询及分页,排序)”的完整攻略。 什么是Spring data jpa? Spring data jpa是Spring Framework的一部分,它在JPA(Java Persistence API)的基础上提供了更简单的方式来访问数据库。它可以轻松地访问各种数据库,并支持分页、排序和动态查询…

    Java 2023年5月20日
    00
  • java == 引发的线上异常详解

    让我来详细讲解一下“java == 引发的线上异常详解”。 概述 在Java开发中,我们通常会使用“==”来比较两个对象是否相等。但是,如果使用不当,就可能会引发线上异常。本文将会详细探讨在Java中使用“==”可能会遇到的问题,以及如何避免这些问题。 引发异常的问题 基本类型与包装类比较 在Java中,基本类型和其对应的包装类是不同的类型,它们互相之间并不…

    Java 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部