快速排序的原理及java代码实现

下面我来详细讲解一下“快速排序的原理及Java代码实现”的完整攻略。

1. 快速排序的原理

快速排序是一种常见的排序算法,其基本思想是:选择一个基准元素,将待排序序列分成两个子序列,使得左边的子序列元素都小于等于基准元素,右边的子序列元素都大于等于基准元素,然后递归地对子序列进行排序,直到整个序列有序。

具体的实现过程如下:

  1. 从待排序序列中选择一个基准元素,通常选择第一个或最后一个元素。
  2. 设置两个指针low和high,分别指向序列的左端和右端。
  3. 从high开始向左扫描,直到找到一个小于等于基准元素的元素,将其与基准元素交换;然后从low开始向右扫描,直到找到一个大于等于基准元素的元素,将其与基准元素交换。
  4. 重复步骤3,直到low>=high,然后将基准元素放入其最终位置。
  5. 对基准元素左右两个子序列分别递归地进行快速排序。

2. Java代码实现

下面是使用Java实现快速排序的示例代码:

public class QuickSort {
    public void quickSort(int[] arr, int left, int right) {
        if (left < right) {
            // 选取基准元素,将序列分割,并返回基准元素的位置
            int pivot = partition(arr, left, right);
            // 递归地对基准元素左边的子序列进行排序
            quickSort(arr, left, pivot - 1);
            // 递归地对基准元素右边的子序列进行排序
            quickSort(arr, pivot + 1, right);
        }
    }

    private int partition(int[] arr, int left, int right) {
        // 选取最左边的元素为基准元素
        int pivot = arr[left];
        int low = left + 1;
        int high = right;
        while (low <= high) {
            // 从高位开始向左扫描,寻找比基准元素小的元素
            while (low <= high && arr[high] >= pivot) {
                high--;
            }
            // 从低位开始向右扫描,寻找比基准元素大的元素
            while (low <= high && arr[low] < pivot) {
                low++;
            }
            // 找到这两个元素后,交换它们的位置
            if (low < high) {
                swap(arr, low, high);
            }
        }
        // 将基准元素放入其最终位置
        swap(arr, left, high);
        return high;
    }

    private void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

示例1:对数组{6, 1, 3, 9, 8, 7}进行排序

int[] arr = {6, 1, 3, 9, 8, 7};
QuickSort q = new QuickSort();
q.quickSort(arr, 0, arr.length - 1);
// 输出排序结果
System.out.println(Arrays.toString(arr));

运行结果如下:

[1, 3, 6, 7, 8, 9]

示例2:对随机生成的一百万个整数进行排序,计算排序时间

int n = 1000000;
Random random = new Random();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
    arr[i] = random.nextInt();
}
QuickSort q = new QuickSort();
long startTime = System.currentTimeMillis();
q.quickSort(arr, 0, arr.length - 1);
long endTime = System.currentTimeMillis();
System.out.println("排序完成,用时:" + (endTime - startTime) + "毫秒");

运行结果如下:

排序完成,用时:66毫秒

3. 总结

快速排序是一种高效的排序算法,其时间复杂度为O(nlogn),因此被广泛应用于各种排序场景中。在实际应用中,需要注意基准元素的选择,以及递归过程中栈空间的使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:快速排序的原理及java代码实现 - Python技术站

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

相关文章

  • 10分钟带你徒手做个Java线程池

    摘要:花10分钟开发一个极简版的Java线程池,让小伙伴们更好的理解线程池的核心原理。 本文分享自华为云社区《放大招了,冰河带你10分钟手撸Java线程池,yyds,赶快收藏吧》,作者:冰 河。 Java线程池核心原理 看过Java线程池源码的小伙伴都知道,在Java线程池中最核心的类就是ThreadPoolExecutor,而在ThreadPoolExec…

    Java 2023年4月19日
    00
  • Mybatis迁移到Mybatis-Plus的实现方法

    下面是针对”Mybatis迁移到Mybatis-Plus的实现方法”的攻略: 1. Mybatis和Mybatis-Plus的简介 Mybatis是一种数据访问层框架,它是一个基于JDBC的大型框架,在实际开发生产中,Mybatis灵活可控、语法简练的特点备受开发人员的喜爱,但是Mybatis虽然功能强大,但是安全性和效率上有一些缺陷。 Mybatis-Pl…

    Java 2023年5月20日
    00
  • Java中JSONObject与JSONArray的使用区别详解

    下面是“Java中JSONObject与JSONArray的使用区别详解”的完整攻略: 1. 什么是JSONObject和JSONArray? 在Java中,JSONObject和JSONArray是用于处理JSON数据的两个重要类。 JSONObject表示JSON对象,即一个存储键值对的容器,每个键值对都是由一个字符串作为键和一个值组成的。JSON对象的…

    Java 2023年5月26日
    00
  • 如何让java只根据数据库表名自动生成实体类

    让我来讲解一下如何让Java只根据数据库表名自动生成实体类的完整攻略。 1. 创建Maven工程 首先,我们需要创建一个Maven工程,用于管理我们的项目依赖和构建。 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.or…

    Java 2023年5月20日
    00
  • springboot 整合canal实现示例解析

    下面是关于“springboot 整合canal实现示例解析”的完整攻略: 1. 什么是Canal? Canal是阿里巴巴开源组织推出的一款数据库增量订阅和消费组件,能够解析MySQL数据库binlog的增量数据,并将数据以类似于MQ的方式进行消费或者解析。Canal能实时获取MySQL数据库的数据变更,解决传统的数据库数据同步方式需要轮询而且存在延迟性的问…

    Java 2023年5月20日
    00
  • Properties 持久的属性集的实例详解

    Properties 持久的属性集的实例详解 概述 Properties 类继承自 Hashtable 类,主要用于处理属性文件。属性文件中的每一行都是一个键值对,用等号分隔,键和值均不可含有等号。属性文件常被用于存储程序的配置信息。Properties 类提供了将属性文件从磁盘中加载、保存到磁盘中、以及修改属性的功能。 基本用法 Properties 类中…

    Java 2023年6月16日
    00
  • Java方法的返回值及注意事项小结

    当我们在编写Java程序时,有时需要从方法中获取数据。在许多情况下,我们希望方法能够返回一个值,这就是Java方法的返回值。在本文中,将介绍Java方法的返回值以及注意事项。 什么是Java方法的返回值? Java方法的返回值是指当方法被调用时,此方法所返回的数据。方法的返回值用于与另一个方法或代码交互。一般情况下,Java方法返回值可以是任何基本数据类型(…

    Java 2023年5月26日
    00
  • javascript es6的常用语法你知道吗

    JavaScript ES6 常用语法 ES6是JavaScript的一种标准,也被称为ECMAScript2015,它为JavaScript添加了很多新特性和语法。以下是ES6中常用的几种语法。 let & const 在ES6之前,我们只能使用var关键字来声明变量。而在ES6中,我们可以使用let和const关键字来声明变量。 let用来声明一…

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