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日

相关文章

  • JS携带参数实现页面跳转功能

    JS携带参数实现页面跳转功能攻略 在开发Web应用时,经常需要跳转到另一个页面,并携带一些参数。本文将详细讲解如何使用JavaScript实现这个功能。 实现思路 在JavaScript中,可以使用window.location对象实现页面的跳转。为了携带参数,可以将参数附加在URL的后面,形如http://example.com/?key1=value1&…

    Java 2023年6月15日
    00
  • java String 可变性的分析

    Java中的String是一个不可变的类,这意味着一旦字符串创建了,就不能更改它的值。然而,在Java的StringBuilder和StringBuffer类中,字符串可变,可以通过追加和插入操作修改现有字符串。本篇攻略将通过示例说明String可变性的特性,帮助读者全面了解String的可变性。 String是不可变的 我们可以使用下面的代码来证明Stri…

    Java 2023年5月27日
    00
  • Sprint Boot @ControllerAdvice使用方法详解

    Spring Boot的@ControllerAdvice的作用与使用方法 在Spring Boot中,@ControllerAdvice注解用于定义全局异常处理器。通过使用@ControllerAdvice注解,可以方便地处理应用程序中的异常,并提供自定义的异常处理逻辑。在本文中,我们将详细介绍@ControllerAdvice注解的作用和使用方法,并提供…

    Java 2023年5月5日
    00
  • 解决Springboot启动报错:类文件具有错误的版本61.0,应为 52.0

    这个问题一般是由于我们使用了java版本比当前springboot版本所支持的版本还要高的原因导致的。下面详细讲解一下解决步骤。 确认java版本和springboot版本 首先需要确认当前java版本和springboot版本是否匹配。可以在命令行中输入以下命令查看java版本: java -version 可以在pom.xml文件中查看springboo…

    Java 2023年6月2日
    00
  • java实现从方法返回多个值功能示例

    下面是Java实现从方法返回多个值的攻略。 实现方式 Java中可以使用以下几种方式来实现从方法返回多个值的功能: 将多个值封装到一个对象中 使用数组或列表(List) 使用Map 将多个值封装到一个对象中 我们可以定义一个类,将需要返回的多个值封装到它的属性中。例如,假设我们需要返回一个人的姓名、年龄和性别,可以这样定义一个Person类: public …

    Java 2023年5月26日
    00
  • Spring Boot JPA中java 8 的应用实例

    下面我将详细讲解“Spring Boot JPA中java 8 的应用实例”的完整攻略,让大家能够更加深入的了解这个话题。 什么是Spring Boot JPA Spring Boot JPA是基于Spring Boot和JPA的框架,它是Spring Boot与JPA框架的整合,使得我们更加便捷地操作JPA。它简化了JDBC的等式操作,大量减少了样板代码的…

    Java 2023年5月20日
    00
  • SpringBoot自定义加载yml实现方式,附源码解读

    首先我们需要了解在SpringBoot中如何读取配置文件。SpringBoot 支持的主配置文件类型有两种: .properties 和 .yml 文件格式。在默认情况下,SpringBoot 会优先读取 .properties 文件,如果同时存在两种格式,.yml 文件会覆盖.properties 文件。 然而,有些时候我们需要动态加载一些配置文件,而这些…

    Java 2023年6月15日
    00
  • 使用JSON.toJSONString格式化成json字符串时保留null属性

    使用JSON.toJSONString方法将Java对象转化为JSON字符串时,默认会将值为null的属性过滤掉。如果需要在生成的JSON字符串中保留null属性,可以通过设置输出时的SerializerFeature来实现。 具体步骤如下: 导入FastJSON库的依赖,示例代码如下: xml <dependency> <groupId&…

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