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日

相关文章

  • 很简单的Java断点续传实现原理

    下面是关于“很简单的Java断点续传实现原理”的完整攻略。 一、什么是Java断点续传? Java断点续传是指,在下载或上传文件时,出现网络中断等问题导致下载或上传任务中断时,可以通过实现“断点续传”功能,让下载或上传任务从中断的地方继续执行,而不是重新开始。 二、Java断点续传的实现原理 Java断点续传的实现原理是,通过HTTP协议中的range请求头…

    Java 2023年5月19日
    00
  • Java Apache Commons报错“FileNotFoundException”的原因与解决方法

    当使用Java的Apache Commons类库时,可能会遇到“FileNotFoundException”错误。这个错误通常由以下原因之一起: 文件路径错误:如果文件路径错误,则可能会出现此错误。在这种情况下,需要检查文件路径以解决此问题。 文件不存在:如果文件不存在,则可能会出现此错误。在这种情况下,需要检查文件是否存在以解决此问题。 以下是两个实例: …

    Java 2023年5月5日
    00
  • jsp页面显示数据库的数据信息表

    下面是如何在JSP页面中显示数据库的数据信息表的完整攻略。 第一步:连接数据库 在JSP中连接数据库需要使用JDBC驱动程序。我们可以使用以下代码来连接MySQL数据库。 <%@ page import="java.sql.*" %> <% Connection con = null; Statement stmt = …

    Java 2023年6月15日
    00
  • java static块和构造函数的实例详解

    Java中的static块和构造函数都是用来初始化类的成员变量的,但两者有着不同的特点和应用场景。下面详细讲解static块和构造函数的用法及其区别。 一、static块 1.1 定义 在Java中,static块是一个静态代码块,用来初始化静态成员变量。在类加载时,如果类中有static块,则首先会执行static块,然后才会执行其他代码块和构造函数。 1…

    Java 2023年5月26日
    00
  • java编写的文件管理器代码分享

    下面是“Java编写的文件管理器代码分享”的完整攻略: 一、介绍 Java是一门广泛使用的编程语言,其编写出的程序可运行在不同操作系统的计算机上,具有很强的跨平台性。在Java中,我们可以使用java.io包中的类来处理文件和文件夹,并实现一个简单的文件管理器。 二、文件管理器基本功能 一个基本的文件管理器应该具有以下功能: 列出文件夹中的所有文件和子文件夹…

    Java 2023年5月20日
    00
  • Java NIO通信基础示例详解

    下面是“Java NIO通信基础示例详解”的完整攻略。 概述 Java NIO是Java 1.4版本引入的一种新的I/O处理方式。相较于传统的I/O方式,NIO采用了非阻塞式I/O模型,使得I/O的效率更高。本文将详细讲解Java NIO通信的基础知识和实现方式。 NIO简介 NIO是New IO的缩写,它是用来替代传统的Java IO的。Java IO(流…

    Java 2023年5月26日
    00
  • Spring Boot高级教程之Spring Boot连接MySql数据库

    连接数据库是Web应用程序开发中的一个重要环节。在Spring Boot应用程序中,我们可以使用Spring Data JPA来连接MySQL数据库。以下是实现Spring Boot连接MySQL数据库的完整攻略: 添加依赖 在Spring Boot应用程序中,我们需要添加以下依赖来连接MySQL数据库: <dependency> <gro…

    Java 2023年5月15日
    00
  • JavaWeb pageContext对象原理解析

    JavaWeb中,pageContext对象是Servlet容器创建的一个特殊对象,它提供了一些方法来访问Servlet上下文信息和共享数据。在本篇文章中,我们将深入探讨pageContext对象的原理和用法。 什么是pageContext对象 在JSP页面中,我们可以通过EL表达式、JSTL标签等方式来获取Servlet上下文对象、request对象等信息…

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