Java深入浅出理解快速排序以及优化方式

Java深入浅出理解快速排序以及优化方式

快速排序简介

快速排序是一种常用的排序算法,它的基本思想是选定一个基准数,通过递归的方式将比基准数小的值放在其左侧,比基准数大的值放在其右侧,最终达到排序的效果。快速排序的时间复杂度为O(nlogn),是一种比较快速有效的排序算法。

快速排序基本流程

  1. 选择一个基准数,例如选定数组的最后一个元素作为基准数;
  2. 遍历数组,将比基准数小的元素移到基准数的左侧,大于或等于基准数的元素移到右侧,可以使用两个指针 low 和 high 分别指向数组的两端,通过交换元素位置实现;
  3. 分别对基准数左侧和右侧的子数组递归执行上述操作,直到完成整个数组排序。

快速排序优化

虽然快速排序是一种高效的算法,但是在实际应用中,还需要进一步优化以提高排序效率和稳定性。

1. 随机化

快速排序的时间复杂度和初始序列的顺序有关,如果序列本身就是有序的或者基本有序的,那么快速排序的效率会大打折扣,甚至会退化到O(n^2)的时间复杂度。为了避免这种情况,可以引入随机化的思想,在排序之前随机选择一个元素作为基准数,降低排序的时间复杂度和随机性。

2. 三点取中法

在选择基准数的时候,如果选择的数刚好是序列的最大值或最小值,则快速排序的效率也会受到影响。在这种情况下,可以采用“三点取中法”,即选择序列的左端、右端和中间元素的中位数作为基准数。

示例说明

示例1:快速排序基本流程

/**
 * 快速排序基本流程
 * 
 * @param arr 待排序的数组
 * @param low 排序起始位置
 * @param high 排序终止位置
 */
public static void quickSort(int[] arr, int low, int high) {
    if (low >= high) { // 当数组长度为1或0时,已经排序完成
        return;
    }
    int i = low;
    int j = high;
    int pivot = arr[high]; // 选择最后一个元素作为基准数
    while (i < j) {
        while (i < j && arr[i] < pivot) { // 从左往右找第一个大于等于pivot的位置
            i++;
        }
        while (i < j && arr[j] >= pivot) { // 从右往左找第一个小于pivot的位置
            j--;
        }
        if (i < j) { // 交换i和j位置的元素
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    arr[high] = arr[i]; // 将基准数放到正确的位置上
    arr[i] = pivot;
    quickSort(arr, low, i - 1); // 对基准数左侧的数组递归执行快速排序
    quickSort(arr, i + 1, high); // 对基准数右侧的数组递归执行快速排序
}

示例2:快速排序优化

/**
 * 快速排序优化
 * 
 * @param arr 待排序的数组
 * @param low 排序起始位置
 * @param high 排序终止位置
 */
public static void quickSort(int[] arr, int low, int high) {
    if (low >= high) {
        return;
    }
    int i = low;
    int j = high;
    int pivot = medianOfThree(arr, low, high); // 选择中位数作为基准数
    while (i < j) {
        while (i < j && arr[i] < pivot) {
            i++;
        }
        while (i < j && arr[j] >= pivot) {
            j--;
        }
        if (i < j) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    arr[high] = arr[i];
    arr[i] = pivot;
    quickSort(arr, low, i - 1);
    quickSort(arr, i + 1, high);
}

/**
 * 三点取中法
 * 
 * @param arr 待排序的数组
 * @param low 排序起始位置
 * @param high 排序终止位置
 * @return 中位数
 */
private static int medianOfThree(int[] arr, int low, int high) {
    int mid = low + (high - low) / 2;
    if (arr[low] > arr[high]) {
        swap(arr, low, high);
    }
    if (arr[mid] > arr[high]) {
        swap(arr, mid, high);
    }
    if (arr[low] > arr[mid]) {
        swap(arr, low, mid);
    }
    return arr[mid];
}

/**
 * 交换数组中两个元素的位置
 * 
 * @param arr 待交换的数组
 * @param i 第一个元素的位置
 * @param j 第二个元素的位置
 */
private static void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java深入浅出理解快速排序以及优化方式 - Python技术站

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

相关文章

  • JSP经典学习笔记(包含各种入门常用语法)

    JSP经典学习笔记攻略 JSP即Java Server Pages,是一种基于 Java 技术的Web应用程序开发技术。它允许开发者在网页中嵌入 Java 代码片段,实现与动态数据交互的功能。本篇攻略将包括以下几个部分: JSP基础语法 JSP内置对象 JSP标准标签库 两条示例说明 JSP基础语法 JSP文件结构 在JSP文件中,可以使用HTML标记和Ja…

    Java 2023年6月15日
    00
  • JSP开发入门(四)–JSP的内部对象

    JSP(JavaServer Pages)是一种动态网页开发技术,通过将静态HTML页面和动态Java代码相结合,实现网页的动态化。在JSP的开发过程中,常会用到JSP的内部对象。本文将详细讲解JSP的内部对象。 JSP的内部对象 JSP有9个内部对象,分别是:request、response、out、session、application、page、exc…

    Java 2023年6月15日
    00
  • Java编程获取当前屏幕分辨率的方法示例

    下面我将详细讲解Java编程获取当前屏幕分辨率的方法示例的完整攻略。 步骤一:引入AWT库 AWT是Java提供的图形界面库,用于处理图形化界面相关的程序。在获取当前屏幕分辨率的过程中,需要用到该库中的Toolkit类,因此首先需要引入该库。 请在Java代码中加入以下语句: import java.awt.Toolkit; 步骤二:使用Toolkit类获取…

    Java 2023年5月26日
    00
  • Java中的8大基本数据类型详解

    Java中的8大基本数据类型详解 在Java中,8大基本数据类型指的是boolean、byte、char、short、int、long、float、double这8种数据类型。它们是Java的基础数据类型,在Java程序中经常被用到。 boolean类型 boolean类型用于存储真假值,取值只有两种:true和false。在Java中,布尔类型的默认值是f…

    Java 2023年5月26日
    00
  • Spring boot搭建web应用集成thymeleaf模板实现登陆

    下面就是详细讲解Spring Boot搭建Web应用集成Thymeleaf模板实现登录的攻略。 1. 新建Spring Boot项目 首先,打开IDE,新建一个Spring Boot项目。在Maven项目的pom.xml中添加thymeleaf依赖: <dependency> <groupId>org.springframework.…

    Java 2023年5月20日
    00
  • MyBatis实现插入大量数据方法详解

    MyBatis实现插入大量数据方法详解 介绍 在实际开发中,可能会遇到需要插入大量数据的情况。如果使用MyBatis默认的SQL语句,会导致多次数据库交互,效率低下。因此,本篇文章将介绍MyBatis如何实现插入大量数据的方法。 使用batch插入 MyBatis提供了批量插入数据的功能,即batch插入。下面是示例代码: <insert id=&qu…

    Java 2023年5月20日
    00
  • Java实现排队论的原理

    Java 实现排队论的原理 什么是排队论 排队论是一种数学模型,用来研究当需求超过资源时如何最优地使用资源。排队论可以用于优化系统、服务、流程等,以保证资源利用率最高并提供最佳的服务质量。 Java 实现排队论 Java 可以通过不同的算法和库来实现排队论的模型。以下是一些常用的 Java 库和算法: 1. SimJava SimJava 是一种面向对象的、…

    Java 2023年5月18日
    00
  • nodejs和php实现图片访问实时处理

    下面给出一份基于nodejs和php实现图片访问实时处理的攻略。 1. 背景 随着互联网技术的快速发展,对于图片的访问和处理需求也越来越多。使用nodejs和php的组合可以满足这种需求,可以实时处理图片访问,提高网站的访问速度和用户体验。 2. 实现过程 下面详细阐述nodejs和php实现图片访问实时处理的完整攻略。 2.1 安装Node.js和PHP …

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