数据结构-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 日

相关推荐

  • 世界,您好!

    欢迎使用 WordPress。这是您的第一篇文章。编辑或删除它,然后开始写作吧!

    未分类 2024 年 6 月 20 日
    1.2K00
  • 【Java】异常处理见解,了解,进阶到熟练掌握

    各位读者,早安、午安、晚安! 如果您发现这篇文章对您有所启发,不妨点赞、评论、分享,您的支持是我不断进步的动力。也欢迎您将这篇文章推荐给更多人。 今天我们将深入探讨Java面向对象编程中的抽象类和接口,让我们一起来看看它们是如何协同工作的。 目录 1.(throws和throw)我们选择忽略这个异常,将其向外抛出 1.1:使用throws时的注意事项 1.2…

    2024 年 12 月 28 日
    33500
  • 【深度学习】Java DL4J基于 RNN 构建智能停车管理模型

    🧑 博主简介:CSDN博客专家 ,历代文学网 (PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索“历代文学 ”)总架构师,15年工作经验,精通Java编程,高并发设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理…

    2025 年 1 月 12 日
    34500
  • Mysql连接报错排查解决记录

    Mysql连接报错排查解决记录 背景: “` 系统:uos server-1060e ​ 运行环境kvm虚拟机 ​ mysql版本:5.7.44, for Linux (x86_64) “` 问题现象: 宿主机重启后,kvm虚拟机内的mysql服务无法远程连接了。通过不同的客户端工具连接,报错现象分别如下: dbeaver-ce 工具连接报错: “` …

    2025 年 1 月 11 日
    52400
  • Python 调整Excel行高、列宽

    在Excel中,默认的行高和列宽可能不足以完全显示某些单元格中的内容,特别是当内容较长时。通过调整行高和列宽,可以确保所有数据都能完整显示,避免内容被截断。合理的行高和列宽可以使表格看起来更加整洁和专业,尤其是在包含大量数据的情况下。 本文将介绍如何通过Python调整Excel的行高列宽、或设置自适应行高列宽 。 Python Excel库 要通过Pyth…

    2024 年 12 月 24 日
    29200

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信