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

相关推荐

  • (2025自测有效!)全网最好的python配置教程【非常非常适合小白】

    前几天我的电脑刚刚重装,把python重新配置了一下。 1.Python环境部署Python3 可应用于多平台包括 Windows、Linux 和 Mac OS X。 Python官网:https://www.python.org/ 进入官网在导航栏选择Dowmloads,选择所使用的系统(以Windows为例) 进入Windows下载页之后选择需要下载的版…

    2025 年 1 月 10 日
    65900
  • 国内ChatGPT订阅升级三分钟教程

    国内ChatGPT订阅升级三分钟教程,讲清快速开通前仍需核对账号和套餐。

    未分类 2026 年 5 月 23 日
    5000
  • 【GreatSQL优化器-09】make_join_query_block

    【GreatSQL优化器-09】make_join_query_block 一、make_join_query_block介绍 GreatSQL优化器对于多张表join的连接顺序在前面的章节介绍过的best_access_path函数已经执行了,接着就是把where条件进行切割然后推给合适的表。这个过程就是由函数make_join_query_block来执…

    2025 年 1 月 12 日
    47700
  • Spring Boot与WebSocket融合全攻略:从入门到高阶应用

    一、WebSocket基础概念与核心原理 1.1 WebSocket协议的本质内涵 WebSocket是一种在单一TCP连接上开展全双工通信的协议,它攻克了HTTP协议在实时通信方面的局限。不同于HTTP那种请求 – 响应的模式,WebSocket允许服务器主动向客户端推送数据,实现了真正意义上的双向交互。 传统HTTP通信的弊病所在: 每一次请求都得重新搭…

    未分类 2025 年 6 月 18 日
    1.5K00
  • PostgreSQL 数据库的启动与停止管理

    title: PostgreSQL 数据库的启动与停止管理date: 2024/12/28updated: 2024/12/28author: cmdragon excerpt:作为一个强大的开源关系数据库管理系统,PostgreSQL在众多应用场景中发挥着关键作用。在实际使用过程中,对于数据库的启动和停止操作至关重要。这不仅关系到数据库的正常运行,也直接影…

    2025 年 1 月 1 日
    47300

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信