优化常见的java排序算法

优化常见的Java排序算法

排序算法是计算机科学中最基础、也是最常用的算法之一。Java提供了多种排序算法的实现,如冒泡排序、插入排序、选择排序、快速排序、归并排序等。但是,这些算法的标准实现在某些情况下可能效率比较低,需要进行优化。

一、冒泡排序

冒泡排序是一种交换排序,基本思想是将相邻的元素两两比较,如果前面的元素大于后面的元素,则交换它们的位置,直到没有相邻元素需要比较为止。冒泡排序时间复杂度为O(n^2)。

优化方案:

  1. 设置标志位,在每次交换元素时标记一下。如果没有元素需要交换,跳出循环。这样可以减少不必要的比较,提高算法效率。
public static void bubbleSortImproved(int[] arr) {
    int n = arr.length;
    boolean swapped = true;
    for (int i = 0; i < n - 1 && swapped; i++) {
        swapped = false;
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                swap(arr, j, j + 1);
                swapped = true;
            }
        }
    }
}
  1. 每次排序保存最后一次交换位置,下一轮排序时只需要比较到这个位置,后面的元素已经排序好了。这样可以减少比较次数,提高算法效率。
public static void bubbleSortImproved(int[] arr) {
    int n = arr.length;
    int lastSwappedIndex = n - 2;
    for (int i = 0; i < n - 1; i++) {
        int currSwappedIndex = -1;
        for (int j = 0; j <= lastSwappedIndex; j++) {
            if (arr[j] > arr[j + 1]) {
                swap(arr, j, j + 1);
                currSwappedIndex = j;
            }
        }
        lastSwappedIndex = currSwappedIndex;
        if (lastSwappedIndex == -1) {
            break;
        }
    }
}

二、快速排序

快速排序是一种常见的分治排序算法,基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后分别对这两部分继续进行排序,以达到整个序列有序的目的。快速排序时间复杂度平均为O(nlogn),最坏情况下为O(n^2)。

优化方案:

  1. 优化基准值的选择。可以使用三数取中法来选择基准值,即从左、右、中间三个元素中选择中间值作为基准值。这样可以避免极端情况下基准值选择不当导致的效率问题。
private static void quickSortImproved(int[] arr, int left, int right) {
    if (right - left < 2) {
        return;
    }
    int midIndex = getMidIndex(arr, left, right);
    int pivot = arr[midIndex];
    swap(arr, midIndex, right - 1);

    int i = left;
    int j = right - 1;
    while (true) {
        while (arr[++i] < pivot) {}
        while (arr[--j] > pivot) {}
        if (i < j) {
            swap(arr, i, j);
        } else {
            break;
        }
    }
    swap(arr, i, right - 1);
    quickSortImproved(arr, left, i - 1);
    quickSortImproved(arr, i + 1, right);
}
private static int getMidIndex(int[] arr, int left, int right) {
    int mid = (left + right) / 2;
    if (arr[left] > arr[mid]) {
        swap(arr, left, mid);
    }
    if (arr[left] > arr[right - 1]) {
        swap(arr, left, right - 1);
    }
    if (arr[mid] > arr[right - 1]) {
        swap(arr, mid, right - 1);
    }
    return mid;
}
  1. 优化小数组的排序。当子序列长度小于一定值时,可以使用插入排序来代替快速排序,这样可以减少递归调用带来的额外开销。
private static void quickSortImproved(int[] arr, int left, int right) {
    if (right - left < 2) {
        return;
    }
    if (right - left < 10) {
        insertionSort(arr, left, right);
        return;
    }

    int midIndex = getMidIndex(arr, left, right);
    int pivot = arr[midIndex];
    swap(arr, midIndex, right - 1);

    int i = left;
    int j = right - 1;
    while (true) {
        while (arr[++i] < pivot) {}
        while (arr[--j] > pivot) {}
        if (i < j) {
            swap(arr, i, j);
        } else {
            break;
        }
    }
    swap(arr, i, right - 1);
    quickSortImproved(arr, left, i - 1);
    quickSortImproved(arr, i + 1, right);
}
private static void insertionSort(int[] arr, int left, int right) {
    for (int i = left + 1; i < right; i++) {
        int temp = arr[i];
        int j;
        for (j = i; j > left && temp < arr[j - 1]; j--) {
            arr[j] = arr[j - 1];
        }
        arr[j] = temp;
    }
}

两条示例说明:

int[] arr1 = {5, 3, 4, 2, 1};
BubbleSort.bubbleSortImproved(arr1);
System.out.println(Arrays.toString(arr1));  // [1, 2, 3, 4, 5]

int[] arr2 = {5, 3, 4, 2, 1};
QuickSort.quickSortImproved(arr2);
System.out.println(Arrays.toString(arr2));  // [1, 2, 3, 4, 5]

以上是优化常见的Java排序算法的攻略,通过实现这些优化方案,可以有效提高排序算法的效率,应用到实际项目中可以更好地满足用户需求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:优化常见的java排序算法 - Python技术站

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

相关文章

  • mybatis 模糊查询的实现方法

    MyBatis是一种流行的Java ORM框架,它可以帮助开发人员轻松地访问数据库。模糊查询是一种常见的查询方式,用于在所有符合特定标准的结果中查找符合特定模式的结果。在MyBatis中实现模糊查询非常简单,本文将详细介绍如何实现。 1. LIKE关键字 实现模糊查询的最常见方法是使用SQL的LIKE关键字。这个关键字指示数据库在检索数据时应该搜索包含指定模…

    Java 2023年5月20日
    00
  • java实现轻轻松松控制台斗地主的示例代码

    如果要在Java程序中实现控制台斗地主游戏,可以按照以下步骤进行: 设计游戏规则:斗地主游戏的规则比较固定,需要设计玩家、牌组、出牌、判胜负等内容。 实现牌组:斗地主游戏使用的是一副扑克牌,需要先定义牌的种类和数量,然后随机洗牌,把牌分配给每个玩家和底牌。 实现玩家出牌:玩家需要根据游戏规则出牌,因此需要实现出牌规则,比如判断出牌是否符合规则,是否由上家出牌…

    Java 2023年5月26日
    00
  • Java性能工具JMeter实现上传与下载脚本编写

    完整攻略: Java性能工具JMeter实现上传与下载脚本编写 本教程旨在通过JMeter实现上传与下载功能的性能测试,为此要求读者已经了解如何使用JMeter进行测试。如果您是JMeter新手,请参阅JMeter官方文档以获取更多信息。 步骤1:下载测试文件 为了执行上传和下载脚本的性能测试,我们需要先准备一些测试文件。可以使用wget命令或浏览器下载,务…

    Java 2023年5月19日
    00
  • Java 通过JDBC连接Mysql数据库

    下面为你详细讲解“Java 通过JDBC连接Mysql数据库”的完整攻略,主要包括以下几个步骤: 准备工作 在开始之前,需要先确保以下几个方面已经满足: 已经安装了Java开发环境(JDK) 已经安装了Mysql数据库,并且知道数据库的用户名和密码 下载了Mysql的JDBC驱动程序,可从官网下载或通过Maven管理工具引入 导入JDBC驱动程序 在Java…

    Java 2023年6月16日
    00
  • Java的引用类型常用的四种方法

    Java的引用类型常用的四种方法包含:按值传递、按引用传递、按可变长数组传递、按包装类传递。接下来我会结合示例详细介绍这四种方法。 按值传递 按值传递是将方法外部的值复制到方法内部,在方法中操作该值,但不会对原始值造成影响。示例代码如下: public class Main { public static void main(String[] args) {…

    Java 2023年5月26日
    00
  • 使用CXF和Jersey框架来进行Java的WebService编程

    使用CXF和Jersey框架进行Java的WebService编程步骤如下: 配置pom.xml文件,添加CXF和Jersey框架相关的依赖。 “` org.apache.cxf cxf-bundle-jaxrs 3.3.6 org.glassfish.jersey.core jersey-server 2.30 org.glassfish.jersey.…

    Java 2023年5月31日
    00
  • Spring Data JPA踩坑记录(@id @GeneratedValue)

    请允许我简单的介绍一下Spring Data JPA以及相关注解。 Spring Data JPA是Spring Framework中一个比较常用且易用的持久层框架,它允许我们使用JPA进行数据库访问操作,简化了数据库操作的代码,在项目的开发中更加高效便捷的实现了基础的CRUD操作。 相关注解有两种,@Id用于标识某个属性为实体类的主键,而@Generate…

    Java 2023年5月20日
    00
  • Spring Aware源码设计示例解析

    让我们来详细讲解一下“Spring Aware源码设计示例解析”的攻略。 简介 在Spring中,我们经常使用Aware接口,例如BeanNameAware、ApplicationContextAware等,用来获得Spring ApplicationContext中的一些特定的信息。本文将对这些Aware接口的实现进行源码分析,并为读者提供一些示例,帮助读…

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