数据结构-8.Java. 七大排序算法(下篇)

![排序算法图解](https://pic.it1024doc.com/csdn/202412/e7a5ab870db2dde966e37f2c83a37ae4.jpeg)

> 本文将深入探讨排序算法的核心概念,由于篇幅限制,我们将分两部分进行讨论。今日的主题是归并排序,以及快速排序的非递归实现技巧。  
>  专栏:Java-**数据结构**  
>  如有疑问,请在评论区留言讨论。  
>  欢迎点赞、评论、收藏和分享本文。  
>  如果你不知道分享给谁,那就分享给热爱技术的朋友吧。  
>  你们的支持是我持续创作的动力。

#### 尊贵的读者,请细读!

  * [快速排序的非递归实现](#快速排序的非递归实现)
    * [具体实现步骤](#具体实现步骤)
      * [区间入栈的细节](#区间入栈的细节)
    * [代码展示](#代码展示)
    * [快速排序的特性总结](#快速排序的特性总结)
  * [归并排序](#归并排序)
    * [归并排序的基本思想](#归并排序的基本思想)
    * [具体步骤](#具体步骤)
      * [分解操作](#分解操作)
      * [合并排序操作](#合并排序操作)
    * [归并排序的非递归实现](#归并排序的非递归实现)
    * [归并排序的特性总结](#归并排序的特性总结)

## 快速排序的非递归实现

在获得基准值pivot后,我们如何对左右子序列进行快速排序呢?答案是利用栈来保存左右区间。

### 具体实现步骤

1. 利用之前的partition算法获取基准值,并将左右区间存储在栈中。
2. 重复上述步骤,直到栈为空。

#### 区间入栈的细节

如下是分析图:
![快速排序区间入栈图解](https://pic.it1024doc.com/csdn/202412/d8041981cc75a0a14a46762ca5c6a7d7.png)

### 代码展示

```java
    // 挖坑法求基准值
    private static int partition2(int[] array, int left, int right) {
        int key = array[left];
        while (left < right) {
            while (left < right && array[right] >= key) {
                right--;
            }
            // 从右边开始第一个比key小的元素覆盖[left]
            array[left] = array[right];
            while (left < right && array[left] <= key) {
                left++;
            }
            // 从左边开始第一个比key大的元素覆盖空位
            array[right] = array[left];
        }
        // key填补最终的空位,此时left=right
        array[left] = key;
        return left;
    }

    // 快速排序的非递归实现
    public static void quickSortNor(int[] array) {
        Stack stack = new Stack<>();
        int left = 0;
        int right = array.length - 1;
        // 获取第一个基准
        int pivot = partition2(array, left, right);
        // 左序列区间端点入栈
        if (pivot - 1 > left) {
            stack.push(left);
            stack.push(pivot - 1);
        }
        // 右序列区间端点入栈
        if (pivot + 1 < right) {
            stack.push(pivot + 1);
            stack.push(right);
        }
        while (!stack.isEmpty()) {
            right = stack.pop();
            left = stack.pop();
            pivot = partition2(array, left, right);
            if (pivot - 1 > left) {
                stack.push(left);
                stack.push(pivot - 1);
            }
            if (pivot + 1 < right) {
                stack.push(pivot + 1);
                stack.push(right);
            }
        }
    }

快速排序的特性总结

  1. 快速排序因其出色的综合性能而得名。
  2. 时间复杂度:O(N*logN)。
    快速排序时间复杂度图解
  3. 空间复杂度:O(logN)。
  4. 稳定性:不稳定。

归并排序

归并排序的基本思想

归并排序(MERGE-SORT)是一种基于归并操作的高效排序算法,它采用分治法(Divide and Conquer

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/4521.html

(0)
LomuLomu
上一篇 2024 年 12 月 27 日 下午8:43
下一篇 2024 年 12 月 27 日

相关推荐

  • 微软开源!Office 文档轻松转 Markdown!

    大家好,我是 Java陈序员。 今天,给大家介绍一款微软开源的文档转 Markdown 工具。 关注微信公众号:【Java陈序员】,获取开源项目分享、AI副业分享、超200本经典计算机电子书籍等。 项目介绍 MarkItDown —— 微软开源的 Python 工具,能够将多种常见的文件格式(如 PDF、PowerPoint、Word、Excel、图像、音频…

    2025 年 1 月 15 日
    48400
  • 新版 Cursor 把其他 AI 编程工具按在地上摩擦了!

    大家好,我是汤师爷~ AI编程助手Cursor背后的Anysphere公司刚刚完成了1亿美元的B轮融资,估值直接飙升至26亿美元。 四个月前,这家公司刚拿下6000万美元,估值还只有4亿美元。如今,增长6.5倍,这速度,简直让人怀疑开挂了。 Anysphere不仅融资拿到手软,收入增长更是逆天。 公司从4月的年收入400万美元,短短六个月后,10月的月收入竟…

    2025 年 1 月 12 日
    84900
  • 一问一答学习PyQT6,对比WxPython和PyQt6的差异

    在我的基于WxPython的跨平台框架完成后,对WxPython的灵活性以及强大功能有了很深的了解,在跨平台的桌面应用上我突然对PyQt6的开发也感兴趣,于是准备了开发环境学习PyQt 6,并对比下WxPython的差异来进行深入的了解,发现它们很多理念和做法是如此的类似。 1、pyqt6都有那些布局控件? PyQt6 提供了多种布局控件,帮助开发者轻松地将…

    2025 年 1 月 10 日
    60200
  • Java编程逻辑掌控指南:从基础到进阶④

    Java编程逻辑掌控指南:从基础到进阶🚀 一、序章:程序员的决策时刻 初始阶段,我的日常如同线性代码般单调:javaSystem.out.println(“清晨7:30醒来”);System.out.println(“整理仪容”);System.out.println(“享用早餐”);// 日复一日的固定流程直到遇见条件判断,生活轨迹开始分叉:javaif(…

    2025 年 5 月 19 日
    25500
  • Python包管理不再头疼:uv工具快速上手

    Python 包管理生态中存在多种工具,如 pip、pip-tools、poetry、conda 等,各自具备一定功能。 而今天介绍的uv 是 Astral 公司推出的一款基于 Rust 编写的 Python 包管理工具,旨在成为 “Python 的 Cargo ”。 它提供了快速、可靠且易用的包管理体验,在性能、兼容性和功能上都有出色表现,为 Python…

    2024 年 12 月 31 日
    80600

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信