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

相关推荐

  • Java数据结构精讲:深入探索链表操作与面试题解析(第三部分)

    专题系列:Java数据结构解析 作者主页:编程探索者内容导航一、链表常见面试题精解1.1. 链表元素分割问题1.2. 判断回文链表1.3. 寻找链表交点1.4. 检测环形链表 一、链表常见面试题精解 1.1. 链表元素分割问题 题目要求保持原始数据顺序不变。我们可以通过遍历链表,将节点根据给定值x分成前后两部分。具体实现时,需要维护四个指针分别表示两个子链表…

    2025 年 5 月 15 日
    21200
  • 解决Java运行时版本不兼容导致的UnsupportedClassVersionError问题

    1、问题现象描述 在使用IntelliJ IDEA将Spring Boot项目打包为JAR文件后,通过命令行运行该JAR时出现以下错误提示:线程”main”中出现异常:java.lang.UnsupportedClassVersionError: com/automation/hweb/HwebApplication的类文件版本(61.0)超过了当前Java…

    2025 年 5 月 19 日
    39000
  • Java中的网络基础认知(如果想知道Java中有关网络基础的知识,那么只看这一篇就足够了!)

    前言:网络基础是现代通信和信息技术的基石,涉及数据传输、网络协议、路由、交换、网络设备以及网络安全等多个方面,深入了解网络基础,不仅能提升技术能力,还能为更复杂的网络架构与应用打下坚实的基础。 ✨✨✨ 这里是秋刀鱼不做梦的BLOG 目录 网络发展史简介 独立模式与网络互连 局域网(LAN) 广域网(WAN) 网络通信基础 —— IP和端口号 IP地址 端口号…

    2024 年 12 月 28 日
    37700
  • RabbitMQ消息中间件核心概念与实践指南

    RabbitMQ概述 RabbitMQ是一款采用Erlang编程语言构建的开源消息代理软件,其官方网站为:RabbitMQ官方平台。本文将深入解析其核心架构原理与基础应用方法。 环境部署 部署过程中需要关注两个关键端口配置:* 15672:管理控制台的访问入口* 5672:消息传输处理接口完成安装后,通过http://127.0.0.1:15672即可访问管…

    2025 年 5 月 11 日
    33400
  • JSP开发实战手册:基于IntelliJ IDEA构建首个动态网页项目

    JSP开发实战手册:基于IntelliJ IDEA构建首个动态网页项目 开篇导读 第一部分:JSP核心概念解析 1.1 JSP的核心功能 1.2 JSP与Servlet的技术关联 第二部分:使用IDEA开发JSP应用 第三部分:JSP与HTML技术对比 3.1 语法结构差异 3.2 注释方式对比 开篇导读 在掌握Web开发基础技术后(包括构建页面结构的HTM…

    2025 年 5 月 13 日
    33300

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信