Java 快速排序

这篇具有很好参考价值的文章主要介绍了Java 快速排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

快速排序是一种常用的基于比较的排序算法,其时间复杂度为 O(nlogn),并且具有稳定性和广泛的应用场景。本文将全面详细的讲解一下 Java 中快速排序算法的原理、实现以及时间复杂度等问题。

一、快速排序的原理

快速排序是一种分治思想的排序算法,其基本原理可以概括为以下三步:

  1. 选取一个基准元素,将待排序数组划分为左右两个子数组;

  2. 将比基准元素小的数都移到左子数组中,将比基准元素大的数都移到右子数组中;

  3. 对左右两个子数组递归执行上述操作,直到每个子数组只剩下一个元素为止。

具体来说,快速排序的过程如下:

  1. 首先选取待排序数组中一个元素作为基准元素,通常选择第一个元素或最后一个元素作为基准元素。

  2. 遍历数组,将小于基准元素的元素放到左边,大于等于基准元素的元素放到右边,此时数组被划分成了两个部分。

  3. 对左半部分和右半部分分别递归执行上述操作,直到排序完成。

需要注意的是,在遍历数组时,一般采用双指针法来实现。具体来说,我们使用一个左指针指向数组的第一个元素,用一个右指针指向数组的最后一个元素,然后从左到右依次遍历数组中的元素,如果当前元素小于基准元素,就将它和左指针所指的元素交换,然后将左指针向右移动一位;如果当前元素大于等于基准元素,就将它和右指针所指的元素交换,然后将右指针向左移动一位。重复上述操作直到左指针和右指针相遇为止。

二、快速排序的实现

在 Java 中,我们可以使用以下代码来实现快速排序算法:

public static void quickSort(int[] arr, int left, int right) {
    if (left < right) { // 当数组只有一个元素时结束递归
        int partitionIndex = partition(arr, left, right); // 对数组进行划分,获取基准元素位置
        quickSort(arr, left, partitionIndex - 1); // 对左子数组递归执行快速排序
        quickSort(arr, partitionIndex + 1, right); // 对右子数组递归执行快速排序
    }
}

public static int partition(int[] arr, int left, int right) {
    int pivot = arr[left]; // 将数组的第一个元素设置为基准元素
    int i = left; // 初始化左指针
    int j = right; // 初始化右指针
    while (i < j) { // 当左指针和右指针没有相遇时循环
        while (i < j && arr[j] >= pivot) { // 右指针从右向左遍历,找到第一个小于基准元素的元素
            j--;
        }
        if (i < j) { // 如果左指针和右指针没有相遇,将右指针所指的元素赋值给左指针所指的位置
            arr[i] = arr[j];
            i++;
        }
        while (i < j && arr[i] < pivot) { // 左指针从左向右遍历,找到第一个大于等于基准元素的元素
            i++;
        }
        if (i < j) { // 如果左指针和右指针没有相遇,将左指针所指的元素赋值给右指针所指的位置
            arr[j] = arr[i];
            j--;
        }
    }
    arr[i] = pivot; // 将基准元素放到最终位置
    return i; // 返回基准元素的位置
}

在上述代码中,quickSort() 方法是快速排序算法的入口,它采用递归的方式对左右两个子数组进行排序。partition() 方法则是用来对数组进行划分的,它使用双指针法来实现。

具体来说,我们首先将数组的第一个元素作为基准元素 pivot,然后初始化左指针 i 和右指针 j。接着,我们先让右指针 j 从右向左遍历数组,找到第一个小于基准元素的元素,并将其赋值给左指针所指的位置;然后让左指针 i 从左向右遍历数组,找到第一个大于等于基准元素的元素,并将其赋值给右指针所指的位置。重复上述操作直到左指针和右指针相遇。

最后,将基准元素 pivot 放到最终位置,即左指针所指的位置,这样就完成了对数组的一次划分。在 partition() 方法中,返回的是基准元素的位置,这个位置将用于快速排序算法的递归操作。

三、快速排序的时间复杂度

快速排序算法的时间复杂度主要取决于对数组进行划分的过程。在最坏情况下,如果每次划分都只能规模减少 1,那么快速排序的时间复杂度为 O(n^2),这种情况发生在数组已经排好序或基本排好序的情况下。

在平均情况下,假设每次划分可以将数组分成大小分别为 k 和 (n-k-1) 的两个子数组,那么快速排序的时间复杂度为 O(nlogn)。这是因为快速排序算法的递归深度为 logn,每一层的比较次数为 n,因此总体比较次数为 nlogn。

需要注意的是,快速排序算法的时间复杂度并不稳定,因为基准元素的选择对算法的效率有很大的影响。如果每次都选取最大或最小的元素作为基准元素,那么算法的时间复杂度将退化到 O(n^2)。因此,在实际应用中,我们通常会采用一些优化技巧来提高快速排序算法的效率,如随机选择基准元素、三数取中法等。文章来源地址https://www.toymoban.com/news/detail-695426.html

到了这里,关于Java 快速排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java面试题】Java基础——排序算法

    冒泡排序★★★ 冒泡排序(Bubble Sort)也是一种简单直观的排序算法。 它重复的遍历过要排序的数列, 一次比较相邻的两个元素,如果他们的顺序错误就把他们交换过来 。 这个算法的名字由来是因为越大的元素会经由交换慢慢\\\"浮\\\"到最后面。 当然,大家可以按照从大到小的

    2024年02月12日
    浏览(34)
  • Java基础(七)排序算法

    1. 冒泡排序 冒泡排序的思想 冒泡排序是一种简单的排序算法,其基本思想是通过多次遍历待排序序列,依次比较相邻的元素并交换位置,使得每次遍历后最大(或最小)的元素冒泡到序列的末尾。 具体步骤如下: 从待排序序列的第一个元素开始,依次比较相邻的两个元素。

    2024年02月13日
    浏览(93)
  • 【Java数据结构与算法】Day2-高级排序(希尔、归并、快速、计数)

    ✅作者简介:热爱Java后端开发的一名学习者,大家可以跟我一起讨论各种问题喔。 🍎个人主页:Hhzzy99 🍊个人信条:坚持就是胜利! 💞当前专栏:【Java数据结构与算法】 🥭本文内容:Java数据结构与算法中的比较高级的排序,希尔排序、归并排序、快速排序、计数排序

    2024年02月02日
    浏览(64)
  • 【算法基础】(一)基础算法 --- 快速排序

    ✨个人主页:bit me ✨当前专栏:算法基础 🔥专栏简介:该专栏主要更新一些基础算法题,有参加蓝桥杯等算法题竞赛或者正在刷题的铁汁们可以关注一下,互相监督打卡学习 🌹 🌹 🌹   题目要求: 给定你一个长度为n的整数数列 请你使用快速排序对这个数列按照从小到大

    2023年04月14日
    浏览(41)
  • 算法基础15 —— 分治算法(归并排序 + 快速排序)

    分治法的基本概念、思想 分治法是一种很重要的算法。 字面解释,分治分治,分而治之。就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。 不难发现,分

    2024年02月03日
    浏览(53)
  • 算法基础(一)| 快速排序和归并排序详解

    ⭐写在前面的话:本系列文章旨在复习算法刷题中常用的基础算法与数据结构,配以详细的图例解释,总结相应的代码模板,同时结合例题以达到最佳的学习效果。本专栏面向算法零基础但有一定的C++基础的学习者。若C++基础不牢固,可参考:10min快速回顾C++语法,进行语法

    2024年02月21日
    浏览(53)
  • 常见排序宝典:帮助快速上手常见基础排序算法(下)

    目录 五、归并排序 1、算法步骤  2、动图演示​编辑  3、代码实现 六、堆排序 1、算法步骤 2、动图演示  3、代码实现 七、快速排序 1、基本思想 2、动图演示 3、代码实现  八、计数排序 1、算法步骤  2、动图演示 ​编辑 3、代码实现  归并排序(MERGE-SORT)是建立在归并操

    2024年04月13日
    浏览(35)
  • 【基础算法】八大排序算法:直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序(快排),归并排序,计数排序

      🧑‍🎓 个人主页:简 料   🏆 所属专栏:C++   🏆 个人社区:越努力越幸运社区   🏆 简       介: 简料简料,简单有料~在校大学生一枚,专注C/C++/GO的干货分享,立志成为您的好帮手 ~ C/C++学习路线 (点击解锁) ❤️ C语言阶段(已结束) ❤️ 数据结构与算法(ing) ❤

    2024年02月01日
    浏览(47)
  • Java实现快速排序

    一.原理 快速排序算法通过多次比较和交换来实现排序,其排序流程如下:   (1)首先设定一个分界值,通过该分界值将数组分成左右两部分。  (2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于分界值,而右

    2024年02月09日
    浏览(41)
  • 快速排序(java代码)

    快排核心思想就是:首先在待排序数组中随便选择一个数作为节点(pivot),然后从最后面(high)往左查找比这个节点(pivot)小的数,并且从最前面(low)往右查找比这个节点(pivot)大的数(low),情况1:找到后就把这两个数进行交换,然后接着上面的查找交换直到low等

    2024年02月12日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包