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日

相关文章

  • springmvc处理模型数据ModelAndView过程详解

    下面为您详细讲解“SpringMVC处理模型数据ModelAndView过程详解”的完整攻略。 1. 什么是SpringMVC处理模型数据ModelAndView? 在SpringMVC中,控制器返回的数据可以是很多类型,其中之一即为ModelAndView类型。ModelAndView是一个包含了模型数据和视图名的数据结构,它用于将处理器方法需要的内容以及…

    Java 2023年6月15日
    00
  • springboot+VUE前后端分离实现疫情防疫平台JAVA

    SpringBoot+Vue前后端分离实现疫情防疫平台JAVA 本文将详细介绍如何使用SpringBoot和Vue实现一个疫情防疫平台。在本文中,我们将使用SpringBoot 2.x版本和Vue 2.x版本。 1. 前后端分离架构 前后端分离架构是一种将前端和后端分离开发的架构模式。在这种架构中,前端和后端分别独立开发,通过API接口进行通信。前端负责展示…

    Java 2023年5月18日
    00
  • java 文件上传(单文件与多文件)

    好的。对于Java文件上传,常见的方式有单文件上传和多文件上传两种。 一、单文件上传 1.前端通过表单实现文件选择和提交操作,后端利用Apache的FileUpload组件进行接收处理。 <form action="upload" enctype="multipart/form-data" method=&quo…

    Java 2023年5月20日
    00
  • Java中的LinkageError是什么?

    LinkageError在Java中是一种错误类型,指的是Class文件在链接阶段出现的错误,可能是缺少需要链接的类或类库、重复加载相同的类库等因素导致。 Java中的LinkageError包括四种类型: VerifyError:在class文件验证阶段出现错误,也就是说,在编译后、在类加载过程中,Java虚拟机会验证class文件的正确性,如果出现问题,…

    Java 2023年4月27日
    00
  • JVM教程之Java代码编译和执行的整个过程(二)

    JVM教程之Java代码编译和执行的整个过程(二) 在第一部分中,我们讲解了Java代码编译和执行的基本过程,包括编译器、虚拟机、类加载器等。本篇文章将更加深入地介绍这个过程的细节和优化技巧,同时提供两个实际示例。 Java源代码编译成字节码文件 在上一篇文章中,我们列出了编译Java源代码的基本命令: javac HelloJava.java 这个命令将生…

    Java 2023年5月26日
    00
  • 深入学习MyBatis中的参数(推荐)

    深入学习MyBatis中的参数(推荐)攻略 MyBatis作为一个高性能的ORM框架,除了SQL语句的编写,还有一个重要且常被忽略的部分就是参数的传递。本攻略将深入讲解MyBatis中参数的使用方法,带你彻底掌握参数传递的技巧。 正文 #{parameter_name} 普通类型 MyBatis中使用#{parameter_name}方式,可以直接在SQL语…

    Java 2023年5月19日
    00
  • IDEA+Maven搭建JavaWeb项目的方法步骤

    下面是“IDEA+Maven搭建JavaWeb项目”的详细攻略,其中包含两条实例操作。 环境准备 安装Java JDK,并配置Java环境变量。 安装Maven,并配置Maven环境变量。 安装IntelliJ IDEA开发工具。 创建Maven项目 打开IntelliJ IDEA,进入主界面,选择“Create New Project”。 在弹出的页面中,…

    Java 2023年5月20日
    00
  • springboot配置mybatis和事务管理方式

    下面是一份关于配置Spring Boot中MyBatis和事务管理的完整攻略,包含两个示例。 一、配置MyBatis和数据库 首先,需要在pom.xml文件中添加MyBatis和数据库依赖 <!– MyBatis依赖 –> <dependency> <groupId>org.mybatis.spring.boot&lt…

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