java 数据结构与算法 (快速排序法)

yizhihongxing

Java 数据结构与算法:快速排序法

算法简介

快速排序(Quick Sort)是一种非常常用的基于比较的排序算法,它的时间复杂度为O(nlogn),是一种效率较高的内部排序方法。

快速排序算法基于分治思想,它把一个大的问题划分成若干个小的问题来解决。快速排序的基本思想是:通过一趟排序将待排序的数据分成两部分,其中一部分数据都比另一部分要小,然后再按照同样的方法对这两个部分数据分别进行快速排序,以达到整个数据变成有序序列的目的。

具体来说,快速排序算法采用分治策略(Divide and Conquer)实现排序。其主要思想是选取一个基准元素,将序列分为两个子序列,依次对子序列进行排序,最终完成排序操作。整个快速排序算法的递归过程如下:

  1. 选取基准元素pivot。
  2. 将序列以pivot为界限分为左右两部分。
  3. 对左右两个子序列分别进行快速排序,直到子序列只有一个元素。
  4. 合并所有子序列得到有序序列。

快速排序法示例

示例一

现在给出一个待排序的数组arr:[4,5,1,8,3,7,9,6,2],如何利用快速排序算法把这个数组排序呢?

Step 1: 选取基准元素,通常可以选择第一个或者最后一个元素作为基准元素,这里我们选择第一个元素4作为基准元素。

Step 2: 将序列以基准元素4为界限分为两个子序列:小于等于4的为左子序列,大于4的为右子序列。

左子序列:[1,3,2]

右子序列:[5,8,7,9,6]

Step 3: 对左右两个子序列分别进行快速排序,即递归进行步骤1和步骤2,最终我们可以得到有序序列。

左子序列排序后为:[1,2,3]

右子序列排序后为:[5,6,7,8,9]

Step 4: 合并左右两个子序列,得到有序序列:[1,2,3,4,5,6,7,8,9]

示例二

再来一个稍微复杂一点的示例,现在给出一个待排序的数组arr:[5,7,6,3,4,2,1,8]。我们按照上面的方法逐步进行快速排序。

Step 1: 选取基准元素5。

Step 2: 将序列以基准元素5为界限分为两个子序列。

左子序列:[3,4,2,1]

右子序列:[7,6,8]

Step 3: 对左右两个子序列分别进行快速排序,左子序列中最小的元素是1,所以它是整个序列的第一个元素,右子序列中最小的元素是6,它位于左子序列所有元素之后,而小于它的所有元素已经被排好序了。因此,在将右子序列中的元素插入到序列中的时候,可以跳过它,将它插入到接下来合适的位置即可。

左子序列排序后为:[1,2,3,4]

右子序列排序后为:[6,7,8]

Step 4: 合并左右两个子序列,得到有序序列:[1,2,3,4,5,6,7,8]

至此,数组arr已经排好序了。

代码实现

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

public class QuickSort {
    public static void quickSort(int[] arr, int left, int right) {
        if (left >= right) {
            return;
        }
        int i = left, j = right, pivot = arr[left];
        while (i < j) {
            while (i < j && arr[j] >= pivot) {
                j--;
            }
            arr[i] = arr[j];
            while (i < j && arr[i] <= pivot) {
                i++;
            }
            arr[j] = arr[i];
        }
        arr[i] = pivot;
        quickSort(arr, left, i - 1);
        quickSort(arr, i + 1, right);
    }

    public static void main(String[] args) {
        int[] arr = {4, 5, 1, 8, 3, 7, 9, 6, 2};
        quickSort(arr, 0, arr.length - 1);
        System.out.println(Arrays.toString(arr));
    }
}

总结

快速排序算法是一种非常实用高效的排序算法,它的核心思想是分治策略,通过选取基准元素将序列分为两个子序列,然后递归排序各个子序列,最终将所有子序列合并成一个有序序列。快速排序算法的时间复杂度为O(nlogn),但最差情况下时间复杂度为O(n^2),因此在实际应用中要谨慎选择。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java 数据结构与算法 (快速排序法) - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 关于spring中不同包中类名相同报错问题的总结

    在 Spring 中,不同的包中出现相同名称的类是很常见的事情。在项目开发过程中,经常会遇到类名相同但是出现在不同包中的情况。在这种情况下,会产生一些问题,例如编译器无法识别应该调用哪个类,如何解决呢? 以下是几个概述解决“关于spring中不同包中类名相同报错问题”的步骤: 使用全包名调用类名 使用 import 关键字指定特定的类 下面将分两个示例详细讲…

    other 2023年6月27日
    00
  • python机器学习笔记:svm(1)——svm概述

    Python机器学习笔记:SVM(1)——SVM概述 本篇文章将介绍一种常用的机器学习算法——SVM,即支持向量机。SVM是一种二分类模型,可用于线性和非线性数据分类。 SVM的概念 SVM是通过将数据映射到高维空间中,找到一条可以将数据分成两部分的分割线来进行分类的。在这个过程中,距离分割线最近的那部分数据点,也就是离分割线最近的支持向量,对分类起到了决定…

    其他 2023年3月29日
    00
  • vue日程/日历管理插件fullcalendar(模仿wps日程)

    Vue日程/日历管理插件FullCalendar攻略 FullCalendar是一个基于jQuery和Moment.js的开源日历插件,用于在Web应用中显示日程和事件。FullCalendar还提供了许多可定制的选项,使您可以轻松地自定义日历的外观和行为。在本攻略中,我们将详细讲解如何在Vue应用程序中使用FullCalendar插件。 FullCalen…

    other 2023年5月9日
    00
  • 2.4 小白必看:零基础安装Linux系统(超级详细)

    @CachePut是Spring Boot框架中的一个注解,用于将方法的返回值更新到缓存中。本文将详细讲解@CachePut的作用和使用方法,并提供两个示例说明。 作用 @CachePut注解的作用是将方法的返回值更新到缓存中,以保证缓存中的数据与数据库中的数据一致。 使用方法 使用@CachePut注解时,需要在应用程序的主类上添加@EnableCachi…

    other 2023年5月5日
    00
  • mysql中数据统计的技巧备忘录

    MySQL中数据统计的技巧备忘录 数据统计是数据库应用的重要领域之一。MySQL中可以使用很多种方法实现数据统计,本篇备忘录总结了一些值得掌握的MySQL数据统计技巧,并提供了示例说明。 聚合函数 MySQL提供了很多方便的聚合函数,如COUNT、SUM、AVG、MAX、MIN等。这些函数能够对数据进行简单的统计分析,常用于统计行数、求和、平均值、最大值、最…

    other 2023年6月25日
    00
  • Golang开发gRPC服务入门介绍

    Golang开发gRPC服务入门介绍 什么是gRPC? gRPC是一种高性能、开源和通用的RPC框架,由Google推出,基于ProtoBuf序列化协议来实现,具有简单易用、跨语言、高效快速等特点。 gRPC工作原理是什么? gRPC基于HTTP/2协议,利用protobuf进行序列化,传输效率极高,具体实现原理请参考官方文档 gRPC的优点 性能高:采用p…

    other 2023年6月27日
    00
  • 22点关于jquery性能优化的建议

    22点关于jQuery性能优化的建议 jQuery是一个功能强大的JavaScript库,但在处理大型项目或复杂页面时,性能可能成为一个问题。下面是22个关于jQuery性能优化的建议,帮助你提高网页的加载速度和响应性。 1. 使用最新版本的jQuery 始终使用最新版本的jQuery,因为每个版本都会修复一些性能问题和错误。 2. 使用压缩版本的jQuer…

    other 2023年7月29日
    00
  • unitygc优化要点

    UnityGC优化要点 UnityGC是Unity引擎的垃圾回收机制,它负责回收不再使用的内存,以避免内存泄漏和内存溢出。在开发Unity游戏时,优化UnityGC是非常重要的,因为它直接影响游戏的性能和稳定性。本文将介绍UnityGC的优化要点,并提供两个示例说明。 优化要点 以下是优化UnityGC的要点: 减少对象的创建和销毁 对象的创建和销毁是Uni…

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