优化常见的java排序算法

yizhihongxing

优化常见的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日

相关文章

  • 使用idea搭建一个spring mvc项目的图文教程

    下面是使用Idea搭建一个Spring MVC项目的详细攻略。 安装Idea:首先,我们需要安装Idea开发工具。可以去JetBrains官网下载最新版的Idea,并安装配置。 创建一个Maven项目:在Idea中选择File -> New -> Project,然后选择Maven项目模板。 配置pom.xml:在Maven项目中,pom.xml…

    Java 2023年5月19日
    00
  • Spring整合ehCache全过程

    下面我将为您详细讲解Spring整合ehCache全过程的完整攻略,包含以下步骤: 引入依赖: 需要将spring-context-support和ehcache的依赖引入到项目中,pom.xml中的配置如下: <dependencies> <dependency> <groupId>org.springframework…

    Java 2023年5月20日
    00
  • 匹配form表单中所有内容的正则表达式

    下面我就来详细讲解匹配form表单中所有内容的正则表达式攻略。 步骤一:理解需求 首先需要理解问题的需求,即需要匹配form表单中所有内容的正则表达式。这里的“所有内容”包括form标签及其所有属性,包括每一个input标签及其属性等等。 步骤二:编写匹配表单标签的正则表达式 首先需要匹配form标签,可以使用以下正则表达式: /<form.*?&gt…

    Java 2023年6月15日
    00
  • SpringMVC框架实现图片上传与下载

    下面是关于“SpringMVC框架实现图片上传与下载”的完整攻略,包含两个示例说明。 SpringMVC框架实现图片上传与下载 SpringMVC是一个流行的Java Web框架,它可以帮助我们更加方便地构建Web应用程序。本文将介绍如何使用SpringMVC框架实现图片上传与下载。 步骤一:创建SpringMVC项目 首先,我们需要创建一个SpringMV…

    Java 2023年5月17日
    00
  • Spring Security过滤器链体系的实例详解

    Spring Security过滤器链体系的实例详解 什么是Spring Security过滤器链体系 Spring Security过滤器链体系是Spring Security的核心内容之一,它负责对用户请求进行安全过滤和授权校验。在Spring Security过滤器链体系中,每一个过滤器都有着不同的用途和功能,并且这些过滤器按一定的顺序组成一条链式结构…

    Java 2023年5月20日
    00
  • java判断字符串中是否包含中文并过滤中文

    下面是Java判断字符串中是否包含中文并过滤中文的完整攻略: 判断字符串中是否包含中文 Java中可以使用正则表达式来判断字符串中是否包含中文,代码示例如下: public static boolean isContainChinese(String str) { String reg = "[\\u4e00-\\u9fa5]"; Pat…

    Java 2023年5月27日
    00
  • ASP.NET微信公众号添加菜单

    下面我将为您详细讲解“ASP.NET微信公众号添加菜单”的完整攻略。 1. 准备工作 首先,在进行微信公众号开发之前,我们需要准备以下工作: 申请微信公众号账号,并获取到对应的AppID和AppSecret。 下载微信公众号开发者工具,该工具可帮助我们进行调试和预览。 创建一个ASP.NET项目,并引入微信公众平台SDK。 2. 添加菜单 在准备工作完成后,…

    Java 2023年5月23日
    00
  • 如何创建SpringBoot项目

    下面是如何创建一个SpringBoot项目的完整攻略,包括两个示例。 概述 SpringBoot是一个开源的Java框架,通常用于创建Web应用程序和微服务。SpringBoot使用约定优于配置的方式,使得应用程序的配置变得非常简单。 在创建SpringBoot项目之前,需要先确保你的机器上已经安装好了Java和Maven环境,这两个环境是构建SpringB…

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