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

相关推荐

  • 2024年 Java 面试八股文(20w字)

    第一章-Java基础篇 1、你是怎样理解OOP面向对象 难度系数:⭐ 面向对象是利于语言对现实事物进行抽象。面向对象具有以下特征: 继承: 继承是从已有类得到继承信息创建新类的过程 封装:封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口 多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应 2、重载与重写区别 难度系数:⭐ 重…

    2024 年 12 月 27 日
    16700
  • Java程序员必读的10本豆瓣高分经典书籍PDF

    要想成为一名优秀的Java程序员,不仅需要精通Java语言本身,还需要扎实的计算机基础、良好的编码习惯以及对软件开发全局的理解。掌握了这些基础知识,就像拥有了九阳神功和乾坤大挪移一样,再学习其它各门各派功夫直接手到擒来! 以下是从计算机基础、编程思想、Java语言、架构设计等方面精选的10本豆瓣高分经典书籍,它们能够帮助Java程序员全面提升编程能力和职业素…

    2025 年 1 月 14 日
    15100
  • 什么是南北向流量和东西向流量?

    在现代云计算和微服务架构中,南北向流量与东西向流量构成了网络通信的两大核心模式。 南北向流量(North-South Traffic) 定义:南北向流量描述了从外部环境进入系统或从系统向外传输的数据流,这通常涉及到客户端与服务器之间的交互,比如用户通过浏览器或移动应用访问Web服务或API。 特点:此类流量穿越系统的边界,例如从外部网络进入内部网络,或者从内…

    未分类 2024 年 12 月 26 日
    28300
  • 多租户解析与Demo

    在做Saas应用时,多租户解析往往是很重要的组成部分,也是用户访问网站最先处理的逻辑。 文前介绍: 多租户的数据库实现方式主要有三种: 单一数据库实现,每条数据标识租户Id进行识别数据属于哪个租户 一租户一个数据库,能够做到完全的数据隔离 混合模式,部分数据在一张表上,主要是一些基础数据;其他业务数据分库存储。 无论是哪种方式都要知道租户是谁才能查询数据库。…

    2024 年 12 月 30 日
    10300
  • 在不同操作系统上安装 PostgreSQL

    title: 在不同操作系统上安装 PostgreSQLdate: 2024/12/26updated: 2024/12/26author: cmdragon excerpt:PostgreSQL 是当今最受欢迎的开源关系数据库管理系统之一,由于其强大的功能和灵活性,广泛应用于不同的行业和应用场景。在开始使用 PostgreSQL 之前,用户需要了解如何在不…

    2024 年 12 月 30 日
    16500

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信