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

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日

相关文章

  • Android笔记之:App列表之下拉刷新的使用

    针对“Android笔记之:App列表之下拉刷新的使用”的完整攻略,我进行如下详细讲解: 攻略概述 在Android App列表中,我们通常使用下拉刷新技术来实现自动更新功能。本攻略将会用Step by Step的方式,详细讲解如何使用Android Studio创建一个带有下拉刷新功能的App列表。 准备工作 在开始实现下拉刷新功能之前,需要先安装Andr…

    other 2023年6月20日
    00
  • OPPO A83开发者选项在哪里?怎么打开USB调试模式?

    要打开OPPO A83的开发者选项和USB调试模式,需要您按照以下步骤进行操作: Step 1: 进入“关于手机”页面 首先,您需要打开您的OPPO A83手机,并进入“设置”页面,然后向下滑动,寻找“关于手机”选项,点击进入该页面。 Step 2: 进入“版本号”页面 在“关于手机”页面中,您需要连续点击“版本号”7次,直到系统提示“您已成为开发者”。 S…

    other 2023年6月26日
    00
  • centos7增加永久静态路由

    CentOS7增加永久静态路由 在 CentOS 7 中,我们可以通过添加永久静态路由来实现使某些 IP 地址或网段走指定的网卡和路由。本文将介绍如何在 CentOS 7 中配置添加基于网关的静态路由。 确定网关 在 CentOS 7 中增加永久静态路由需要知道目标网段或 IP 所在的网关。我们可以通过执行以下命令来查看当前主机所连接的网关: route -…

    其他 2023年3月28日
    00
  • docker版本

    Docker版本的完整攻略 Docker是一种流行的容器化平台,可以帮助开发人员和运维人员更轻松地构建、部署和管理应用程序。在使用Docker时,需要了解不同版本之间的差异和功能。本文将详细介绍Docker版本的内容,并提供两个示例说明,以帮助您更好地了解和应用这些技术。 Docker版本 Docker有两个主要版本:Docker CE(社区版)和Docke…

    other 2023年5月7日
    00
  • 魔兽世界更新卡初始化怎么办 卡初始化及hosts文件修改方法

    当魔兽世界卡在初始化界面时,可能是因为您的hosts文件没有正确配置,或者是blizzard更新服务器出现问题。下面将详细介绍魔兽世界卡初始化的问题原因以及解决方法。 一、问题原因 Host 文件未正确配置:魔兽世界更新器需要访问 blizzard 更新服务器才能更新游戏。在国内,由于 GFW 的存在,可能需要通过修改 Host 文件以实现通过 VPN 访问…

    other 2023年6月20日
    00
  • HQL常用的查询语句

    HQL常用的查询语句 HQL(Hibernate Query Language)是Hibernate框架中用于查询数据的一种语言,类似于SQL。在HQL中,查询语句是面向对象的,使用Java类名及属性名代替SQL中的表名和列名,能够方便地进行对象导航和属性过滤。在本文中,我们将介绍HQL中常用的查询语句。 1. from语句 from Entity from…

    其他 2023年3月28日
    00
  • 如何清除网页上自动保存的登陆用户名密码

    清除网页上自动保存的登录用户名密码,可以分为两种情况,一种是浏览器自动填充功能保存的表单数据,另一种是浏览器缓存密码保存功能。针对这两种情况,我们分别介绍如何清楚这些保存的账户密码。 清除浏览器自动填充保存的表单数据 许多浏览器都会提供自动填充功能,自动保存表单数据,包括用户名和密码。一般在输入表单时,浏览器会自动弹出保存对话框,如果保存了账户密码,下次输入…

    other 2023年6月27日
    00
  • Javaweb动态开发最重要的Servlet详解

    下面是《Javaweb动态开发最重要的Servlet详解》的完整攻略: 一、Servlet概述 什么是Servlet? Servlet是Java编写的Server端程序,它可以接受客户端的请求(浏览器等)并生成相应的响应。 Servlet的作用是什么? Servlet的作用与Web Server相同,都是为了在Web上提供服务,不同的是Servlet只能在W…

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