Java基础(十一)快速排序

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

4. 快速排序

>> 快速排序的思想
Java基础(十一)快速排序,Java,java,排序算法,算法

快速排序(QuickSort)是一种高效的排序算法,基于分治策略。它的原理可以概括为以下步骤:

  1. 选择一个基准元素(pivot),通常选择数组中的一个元素作为基准。这个基准元素将用来将数组分割为较小和较大的两个子数组。

  2. 分区过程(Partition):将数组中的元素重新排列,将所有比基准元素小的元素移动到其左边,所有比基准元素大的元素移动到其右边。基准元素的最终位置被确定,称为分区点(partition point),这个过程称为分区。

  3. 对两个子数组递归地应用上述过程。递归地将子数组分别进行分区,直到子数组的大小为零或一。递归的结束条件是当子数组的大小为零或一时,说明数组已经有序。

  4. 合并子数组:将所有子数组合并为最终的排序数组。

具体步骤如下:

  1. 选择基准元素,通常选择最右边的元素。
  2. 使用两个指针,一个指向数组的起始位置(low),另一个指向数组的结束位置(high)。
  3. 从起始位置开始,遍历数组,比较每个元素与基准元素的大小关系:
    • 如果元素小于基准元素,将指针 i 向后移动一位,并交换指针 i 和 j 对应的元素。
    • 如果元素大于或等于基准元素,只移动指针 j 向后移动一位。
  4. 当遍历结束时,将基准元素与指针 i 对应的元素交换位置,这样基准元素就处于正确的位置上。
  5. 以基准元素为界,将数组分为两个子数组。对左边的子数组和右边的子数组递归地应用上述过程,直到子数组的大小为零或一。
  6. 递归结束后,所有子数组都有序。将所有子数组合并起来,即得到最终的有序数组。

快速排序的平均时间复杂度为 O(n log n),其中 n 是待排序的元素数量。它是一种原地排序算法,不需要额外的空间。由于其高效性和普适性,快速排序是常用的排序算法之一。

>> 快速排序代码实现

package kfm.bases.Sort;

public class QuickSort {
    public static void main(String[] args) {
        int[] arr = {5, 9, 1, 3, 2, 7, 3};

        System.out.println("Original array: ");
        printArray(arr);

        quickSort(arr, 0, arr.length - 1);

        System.out.println("\nSorted array: ");
        printArray(arr);
    }

    public static void quickSort(int[] arr, int low, int high) {
        // 检查左边界 low 是否小于右边界 high
        if (low < high) {
            // 调用 partition 方法来确定枢轴元素的正确位置,并返回此位置作为 pivotIndex
            int pivotIndex = partition(arr, low, high);
            // 对数组左边进行快排
            quickSort(arr, low, pivotIndex - 1);
            // 对数组右边进行快排
            quickSort(arr, pivotIndex + 1,high);
        }
    }

    // 确定枢轴元素的正确位置,并将数组分为两个子数组。
    public static int partition(int[] arr, int low, int high) {
        // 选取最右边元素轴元素
//        int pivot = arr[high];
//        int i = low - 1;
//
//        for (int j = low; j < high; j++) {
//            if (arr[j] > pivot) {
//                i ++;
//                swap(arr, i, j);
//            }
//        }
//        swap(arr,i + 1, high);
//        return i + 1;

        // 选择最左边元素为轴元素
        int left = low;
        int right = high;
        int base = arr[low];
        while (left < right) {
            while (left < right && arr[right] >= base) {
                right--;
            }
            while (left < right && arr[left] <= base) {
                left++;
            }
            swap(arr, left, right);
        }
        swap(arr, low, left);
        return left;
    }

    // 输出数组元素
    public static void printArray(int[] arr) {
        for (int num : arr) {
            System.out.print(num + " ");
        }
        System.out.println();
    }

    // 交换位置
    public static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

在快速排序算法中,选择基准值的位置可以对算法的性能产生一定的影响。常见的选择基准值的方法有三种:选最左边元素、选最右边元素和选中间元素。

  • 选最左边元素和选最右边元素作为基准值是最简单和最常见的两种方法,它们之间的主要区别在于分区操作的开始位置。如果选择最左边元素作为基准值,分区操作将从序列的左端开始,而选择最右边元素作为基准值,分区操作将从序列的右端开始。

  • 在理想情况下,序列中的元素按照相对大小均匀分布,即序列近似有序。在这种情况下,选择最左边或最右边的元素作为基准值并不会导致分区不平衡的问题,因为分区操作的结果会大致均匀地将较小和较大的元素分布在两个子序列中。

  • 然而,如果序列中的元素出现大量的重复元素,或者序列已经按照近似有序排列,那么选择最左边或最右边的元素作为基准值可能会导致分区不平衡的情况。这样会使得算法的时间复杂度退化到 O(n^2),而不是平均情况下的期望时间复杂度 O(nlogn)

  • 为了避免这种情况,可以采用一些优化策略,如随机选择基准值、三数取中法(选取最左边、最右边和中间位置的元素的中位数作为基准值)等。这样可以增加算法的鲁棒性和适应性,降低时间复杂度的波动性。

综上所述,选择基准值的位置对快速排序算法可能会产生一定的影响,特别是在面对特定分布模式的输入数据时。因此,在实际应用中,根据具体情况选择合适的基准值选择策略,以获取更好的排序性能。文章来源地址https://www.toymoban.com/news/detail-649699.html

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

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

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

相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2024年02月09日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包