Java编程实现快速排序及优化代码详解

Java编程实现快速排序及优化代码详解

什么是快速排序

快速排序是一种高效的排序算法,其基本思路是将待排序序列分成两个子序列,其中一个子序列中的所有元素都比另一个子序列中的元素小,然后分别对这两个子序列递归排序。具体实现过程中需要选取一个基准元素,将待排序序列中的其他元素与基准元素进行比较,将小于等于基准的元素放入左半部分,大于基准的元素放入右半部分。如此递归排序,最终实现整个序列有序。在实践中,快速排序被证明具有较高的效率和可靠性。

快速排序的实现

下面是Java实现的快速排序代码。

public class QuickSort {

    /**
     * 使用快速排序算法对数组进行排序
     * @param arr 待排序数组
     */
    public static void quickSort(int[] arr) {
        sort(arr, 0, arr.length - 1);
    }

    /**
     * 对数组中指定的子序列进行排序
     * @param arr 待排序数组
     * @param left 子序列左端点
     * @param right 子序列右端点
     */
    public static void sort(int[] arr, int left, int right) {
        if (left < right) {
            int i = left, j = right, pivot = arr[left];
            while (i < j) {
                //从右向左遍历,查找小于等于基准数的位置
                while (i < j && arr[j] > pivot) {
                    j--;
                }
                if (i < j) {
                    arr[i++] = arr[j];
                }
                //从左向右遍历,查找大于基准数的位置
                while (i < j && arr[i] < pivot) {
                    i++;
                }
                if (i < j) {
                    arr[j--] = arr[i];
                }
            }
            arr[i] = pivot;
            sort(arr, left, i - 1);
            sort(arr, i + 1, right);
        }
    }
}

快速排序的优化

进一步优化可将数组中的基准元素选取更为准确的位置,如选择三数取中法,取三个数中的中间值作为基准元素,从而尽可能避免最坏情况的出现(即子序列分割的非常不平衡),使得算法在一般情况下有更高的效率。

public static void sort(int[] arr, int left, int right) {
    if (left < right) {
        int i = left, j = right, pivot = medianOfThree(arr, left, right);
        while (i < j) {
            while (i < j && arr[j] >= pivot) {
                j--;
            }
            if (i < j) {
                arr[i++] = arr[j];
            }
            while (i < j && arr[i] <= pivot) {
                i++;
            }
            if (i < j) {
                arr[j--] = arr[i];
            }
        }
        arr[i] = pivot;
        sort(arr, left, i - 1);
        sort(arr, i + 1, right);
    }
}
/**
 * 选取子序列中前中后三个数中的中间值作为基准元素
 * @param arr 待排序数组
 * @param left 子序列左端点
 * @param right 子序列右端点
 * @return 基准元素
 */
public static int medianOfThree(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]) {
        swap(arr, left, right);
    }
    if (arr[mid] > arr[right]) {
        swap(arr, mid, right);
    }
    swap(arr, mid, right - 1);
    return arr[right - 1];
}
/**
 * 交换数组中指定位置的元素
 * @param arr 数组
 * @param i 索引1
 * @param j 索引2
 */
public static void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

示例说明

示例1:对整型数组进行排序

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

运行结果:[1, 2, 3, 4, 5]

示例2:对字符串数组进行排序

String[] arr = {"abc", "ab", "a", "abcd", "abcde"};
 Arrays.sort(arr);
 System.out.println(Arrays.toString(arr));

运行结果:[a, ab, abc, abcd, abcde]

总结

通过上述示例,我们可以看到Java实现快速排序的过程,其基本思路是将待排序序列分成两个子序列,其中一个子序列中的所有元素都比另一个子序列中的元素小,然后对这两个子序列递归排序。为了提高效率并避免最坏情况出现,还可以采用选取基准元素的优化方案,如三数取中等方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java编程实现快速排序及优化代码详解 - Python技术站

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

相关文章

  • springboot使用nacos的示例详解

    Spring Boot 使用 Nacos 的示例详解 在本文中,我们将详细介绍如何在 Spring Boot 中使用 Nacos。我们将介绍 Nacos 的概念、配置和使用,并提供两个示例。 Nacos 概念 Nacos 是一个开源的动态服务发现、配置和服务管理平台。Nacos 可以帮助我们快速搭建微服务架构,并提供了许多开箱即用的功能,如服务注册、配置管理…

    Java 2023年5月15日
    00
  • 一文详解Java中字符串的基本操作

    一文详解Java中字符串的基本操作 字符串定义 在Java中,字符串是一种数据类型,用来表示一系列的字符组合。在Java中,字符串是用双引号(” “)括起来的,可以包含任意数量的字符。 String str1 = "hello world"; 字符串拼接 在Java中,字符串可以通过加号(+)进行拼接。 String str1 = &qu…

    Java 2023年5月26日
    00
  • MyBatis-Plus动态表名的使用

    下面是关于MyBatis-Plus动态表名的使用的完整攻略。 1. 什么是MyBatis-Plus动态表名 MyBatis-Plus是MyBatis的一个增强工具包,提供了许多增强功能,其中之一就是动态表名。动态表名指的是,在一些场景下,我们需要在同一SQL语句中操作多张表,或者需要让表名根据不同的参数而动态变化,此时就可以使用MyBatis-Plus提供的…

    Java 2023年5月20日
    00
  • java servlet过滤器使用示例

    请看下面的详细讲解: Java Servlet 过滤器使用示例 什么是过滤器? 过滤器是用于拦截请求或响应的一种特殊的 Java web 组件,它能够拦截某个请求,进行某些处理(例如:验证、统计等),然后将请求传递给下一个组件或返回响应给客户端。过滤器是一个独立的组件,它可以被任意 web 应用程序重用。 过滤器的工作原理 过滤器在 Servlet 容器中扮…

    Java 2023年5月20日
    00
  • mybatis @Intercepts的用法解读

    下面将详细讲解 “MyBatis @Intercepts 的用法解读”。 1. @Intercepts 简介 @Intercepts 是 MyBatis 中提供的一个注解,用于标记拦截器对象。 2. 用法解读 首先,我们需要了解 MyBatis 中的拦截器机制。 MyBatis 中的拦截器就是一个实现了 org.apache.ibatis.plugin.In…

    Java 2023年5月20日
    00
  • Java 8 Stream操作类型及peek示例解析

    Java 8 Stream操作类型及peek示例解析 Java 8引入了Stream API,可用于对集合和数组进行函数式操作。本篇攻略将介绍Java 8中Stream API的操作类型,并详细讲解peek()操作的定义、用法和示例。 Stream API操作类型 Stream API包含两种类型的操作:Intermediate(中间操作)和Terminal…

    Java 2023年5月26日
    00
  • Java文件操作之序列化与对象处理流详解

    Java 文件操作之序列化与对象处理流详解 什么是序列化? 序列化是将一个 Java对象转换成可存储或可传输的格式,比如二进制流、XML或者JSON格式。序列化可以将一个对象传输到网络上,也可以存储到本地磁盘,或者传输到远程服务器上。 为什么需要序列化? 当我们需要将一个对象从一个Java应用传输到另外一个Java应用时,无法直接将对象传输到网络上或操作系统…

    Java 2023年5月19日
    00
  • mybatis 查询方式与效率高低对比

    我来为您讲解一下“mybatis 查询方式与效率高低对比”的攻略。 一、Mybatis 查询方式 Mybatis 查询方式有以下几种: 简单查询方式:普通方式的查询,直接获取返回的结果; 嵌套查询方式:一次 SQL 根据外表的数据查询内表的多组数据; 延迟查询方式:一次 SQL 查询的结果对象是代理对象,只有当对象属性被真正访问的时候才会查询; 分布式查询方…

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