【算法】快速排序、归并排序(非递归版)

目录

一、快速排序(非递归)

1.原理

2.实现

2.1 stack

2.2 partition(array,left,right)

2.3 pivot - 1 > left

二、归并排序(非递归)

1.原理

2.实现

2.1 gap

2.1.1 i += 2*gap

2.1.2 gap *= 2

2.1.3 gap < array.length

2.2 left、mid、right

2.2.1 left = i

2.2.2 mid >= array.length


前言:

 在看快速排序的非递归实现之前,可以先看看快速排序用递归实现的版本:【算法】快速排序(递归实现),里面有详细介绍下面讲到的基准排序,基准排序是快速排序实现的基础,最好先去了解下再往下看

递归实现归并排序的也献上【算法】归并排序(递归实现)

一、快速排序(非递归)

1.原理

  • 在每一个待排元素所确定在的待排序区间内把待排序元素用基准排序一个个排好等到把所有待排序区间对应的一个个待排序元素都排好后,整个数组就排好了

(在区间内进行基准排序时,默认以区间第一个元素为待排序元素)

用基准排序把每一个元素在对应已知的待排序范围排好,因为每排好一个元素,此元素排序位置确定且其排出的左小右大性质能缩小剩余的元素的待排序范围区域,所以每当一个元素排好后,其余元素对应的已知待排序范围就会发生变化,所以元素所在的待排序区域是经过动态变化来的


2.实现

    public static void quickSortNonR(int[] array) {Stack<Integer> stack = new Stack<>();//2.1int left = 0;int right = array.length-1;int piovt = partition(array,left,right);//2.2if(piovt - 1 > left) {//2.3stack.push(left);stack.push(piovt-1);}if(piovt + 1 < right) {stack.push(piovt+1);stack.push(right);}while (!stack.isEmpty()) {right = stack.pop();left = stack.pop();piovt = partition(array,left,right);if(piovt - 1 > left) {stack.push(left);stack.push(piovt-1);}if(piovt + 1 < right) {stack.push(piovt+1);stack.push(right);}}}//2.2基准排序挖坑法实现:private static int partition(int[] array,int left,int right) {int key = array[left];while (left < right) {while (left < right && array[right] >= key) {right--;}//right下标元素一定比key小array[left] = array[right];while (left < right && array[left] <= key) {left++;}//left下标元素一定比key大array[right] = array[left];}array[left] = key;return left;}

2.1 stack

利用栈的动态进出存储删取管理这些动态区间


2.2 partition(array,left,right)

partition方法是默认拿待排序区间的第一个元素为基准完成该元素在待排序区间内排好的


2.3 pivot - 1 > left

说明剩下的左边的待排序区域至少有两个元素,还是需要去进行基准排序的


二、归并排序(非递归)

1.原理

一轮轮去有序数组gap的两两合并去合并的有序数组单位会越来越大,直到最后一次两两合并后成的是整体数组的一个有序数组,数组就整体排好序了


2.实现

    public static void mergeSortNor(int[] array) {int gap = 1;//2.1while (gap < array.length) {//2.1.3for (int i = 0; i < array.length; i += 2*gap) {//2.1.1int left = i;//2.2.1int mid =left+gap-1;int right = mid+gap;if(mid >= array.length) {//2.2.2mid = array.length-1;}if(right >= array.length) {right = array.length-1;}merge(array,left,right,mid);}gap *= 2;//2.1.2}}private static void merge(int[] array, int left, int right, int mid) {int s1 = left;int s2 = mid+1;int[] tmpArr = new int[right-left+1];int k = 0;//证明两个区间都同时有数据的while (s1 <= mid && s2 <= right) {if(array[s2] <= array[s1]) {tmpArr[k++] = array[s2++];}else {tmpArr[k++] = array[s1++];}}while (s1 <= mid) {tmpArr[k++] = array[s1++];}while (s2 <= right) {tmpArr[k++] = array[s2++];}//tmpArr里面一定是这个区间内有序的数据了for (int i = 0; i < tmpArr.length; i++) {array[i+left] = tmpArr[i];}}

2.1 gap

每轮去两两合并的单有序数组的元素个数,最开始的单位有序数组长度是1


2.1.1 i += 2*gap

一轮中往后继续去合并下一对的两gap有序数组


2.1.2 gap *= 2

一轮全部两两合并完后gap单位有序数组长度已翻倍


2.1.3 gap < array.length

gap >= array.length时,继续去有序数组合并也都只有一个靠前的左数组(整体数组),去合并也是没有变化了,且其实在gap >= array.length之前就一定有最后一次的两两合并成整体有序数组的了


2.2 left、mid、right

  • [left,mid] —> 两合并数组中靠前gap长度有序数组
  • (mid,right] —> 两合并数组中靠后gap长度有序数组

2.2.1 left = i

i < array.length,再进来的left是一定是left < array.length的


2.2.2 mid >= array.length
  • 如果mid < array.length 但 right >= array.length

左右两数组靠前的正常满足gap长度,靠后的不足gap长度,merge合并时也是正常合并

  • 如果mid >= array.length - 1

只有一个靠前的左数组,merge合并后还是它没变的左数组

三、排序总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/902226.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CasualLanguage Model和Seq2Seq模型的区别

**问题1&#xff1a;**Causal Language Modeling 和 Conditional Generation 、Sequence Classification 的区别是什么&#xff1f; 因果语言模型(Causal Language Model)&#xff1a; 预测给定文本序列中的下一个字符&#xff0c;一般用于文本生成、补全句子等&#xff0c;模型…

【计算机视觉】三维视觉项目 - Colmap二维图像重建三维场景

COLMAP 3D重建 项目概述项目功能项目运行方式1. 环境准备2. 编译 COLMAP3. 数据准备4. 运行 COLMAP 常见问题及解决方法1. **编译问题**2. **运行问题**3. **数据问题** 项目实战建议项目参考文献 项目概述 COLMAP 是一个开源的三维重建软件&#xff0c;专注于 Structure-from…

状态管理最佳实践:Bloc架构实践

状态管理最佳实践&#xff1a;Bloc架构实践 引言 Bloc (Business Logic Component) 是Flutter中一种强大的状态管理解决方案&#xff0c;它基于响应式编程思想&#xff0c;通过分离业务逻辑和UI表现层来实现清晰的代码架构。本文将深入探讨Bloc的核心概念、实现原理和最佳实践…

Python多任务编程:进程全面详解与实战指南

1. 进程基础概念 1.1 什么是进程&#xff1f; 进程(Process)是指正在执行的程序&#xff0c;是程序执行过程中的一次指令、数据集等的集合。简单来说&#xff0c;进程就是程序的一次执行过程&#xff0c;它是一个动态的概念。 想象你打开电脑上的音乐播放器听歌&#xff0c;…

Linux 网络基础(二) (传输协议层:UDP、TCP)

目录 一、传输层的意义 二、端口号 1、五元组标识一个通信 2、端口号范围划分 3、知名端口号&#xff08;Well-Know Port Number&#xff09; &#xff08;1&#xff09;查看端口号 4、绑定端口号数目问题 5、pidof & netstat 命令 &#xff08;1&#xff09;ne…

得佳胜哲讯科技 SAP项目启动会:胶带智造新起点 数字转型新征程

在全球制造业加速向数字化、智能化转型的浪潮中&#xff0c;胶带制造行业正迎来以“自动化生产、数据化运营、智能化决策”为核心的新变革。工业互联网、大数据分析与智能装备的深度融合&#xff0c;正推动胶带制造从传统生产模式向“柔性化生产精准质量控制全链路追溯”的智慧…

大数据学习栈记——MapReduce技术

本文介绍hadoop中的MapReduce技术的应用&#xff0c;使用java API。操作系统&#xff1a;Ubuntu24.04。 MapReduce概述 MapReduce概念 MapReduce是一个分布式运算程序的编程框架&#xff0c;核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序…

Centos9 离线安装 MYSQL8

centos 9 离线安装 mysql 8 参考教程 1. 官网下载mysql 下载地址 2. 将文件传输到Centos中解压 软件全部安装到了/opt中 在opt中新建mysql目录&#xff0c;解压到mysql目录中 tar -xvf mysql压缩文件 mysql[rootcentoshost mysql]# ls mysql-community-client-8.4.5-1.e…

helm的go模板语法学习

1、helm chart 1.0、什么是helm&#xff1f; 介绍&#xff1a;就是个包管理器。理解为java的maven、linux的yum就好。 安装方法也可参见官网&#xff1a; https://helm.sh/docs/intro/install 通过前面的演示我们知道&#xff0c;有了helm之后应用的安装、升级、查看、停止都…

display的一些学习记录

收集的SDM的log&#xff1a; 01-01 00:00:15.311 933 933 I SDM : Creating Display HW Composer HAL 01-01 00:00:15.311 933 933 I SDM : Scheduler priority settings completed 01-01 00:00:15.311 933 933 I SDM : Configuring RPC threadpool 0…

【Rust 精进之路之第2篇-初体验】安装、配置与 Hello Cargo:踏出 Rust 开发第一步

系列&#xff1a; Rust 精进之路&#xff1a;构建可靠、高效软件的底层逻辑 **作者&#xff1a;**码觉客 发布日期&#xff1a; 2025-04-20 引言&#xff1a;磨刀不误砍柴工&#xff0c;装备先行&#xff01; 在上一篇文章中&#xff0c;我们一起探索了 Rust 诞生的缘由&…

【深度学习】计算机视觉(17)——ViT理解与应用

文章目录 Embedding1 概念2 Q&A &#xff08;1&#xff09;3 Positional Encoding4 Q&A &#xff08;2&#xff09; ViT样例及Embedding可视化理解1 简化ViT练习2 CLS Token3 Embedding可视化4 多头注意力可视化 Embedding技术体系结构参考来源 在研究中对特征的编码和…

肖特基二极管详解:原理、作用、应用与选型要点

一、肖特基二极管的基本定义 肖特基二极管&#xff08;Schottky Diode&#xff09; 是一种基于金属-半导体结&#xff08;肖特基势垒&#xff09;的二极管&#xff0c;其核心特性是低正向压降&#xff08;Vf≈0.3V&#xff09;和超快开关速度。 结构特点&#xff1a;阳极采用金…

DeepSeek在数据仓库的10大应用场景

一、智能数据集成与清洗 多源数据整合&#xff1a;DeepSeek能够从多种数据源中提取、转换和加载数据&#xff0c;实现跨系统数据的高效整合。 数据清洗与标准化&#xff1a;通过智能算法自动识别并纠正数据中的错误、不一致性和缺失值&#xff0c;提升数据质量。 二、数据仓…

提示词构成要素对大语言模型跨模态内容生成质量的影响

提示词构成要素对大语言模型跨模态内容生成质量的影响 提示词清晰度、具象性与质量正相关 限定指向性要素优于引导指向性要素 大语言模型生成内容保真度偏差 以讯飞星火大模型为实验平台,选取100名具备技术素养的人员,从提示词分类、构成要素和实践原则归纳出7种提示词组…

BeautifulSoup 库的使用——python爬虫

文章目录 写在前面python 爬虫BeautifulSoup库是什么BeautifulSoup的安装解析器对比BeautifulSoup的使用BeautifulSoup 库中的4种类获取标签获取指定标签获取标签的的子标签获取标签的的父标签(上行遍历)获取标签的兄弟标签(平行遍历)获取注释根据条件查找标签根据CSS选择器查找…

关于MacOS使用Homebrew的详细介绍

Homebrew 是 macOS&#xff08;和 Linux&#xff09;上最流行的包管理工具&#xff08;Package Manager&#xff09;&#xff0c;用于快速安装、更新和管理各种开发工具、命令行程序、开源软件等。它类似于&#xff1a; Ubuntu/Debian 的 aptCentOS/RHEL 的 yumWindows 的 Cho…

最新扣子空间实操指南

一、首先要先获取到内部测试的邀请码&#xff0c; 我们先打开扣子空间官网&#xff1a;https://space.coze.cn/ 输入邀请码后进入该页面&#xff1a; 它这里支持文件上传&#xff0c;扩展里面有很多插件&#xff0c;页支持MCP各种插件. 探索模式有两种&#xff0c;一种是ai自…

ubuntu22.04安装dukto

1.添加源 sudo add-apt-repository ppa:xuzhen666/dukto2.进行更新和安装 sudo apt update sudo apt install dukto3.报错 $ sudo apt install dukto 正在读取软件包列表... 完成 正在分析软件包的依赖关系树... 完成 正在读取状态信息... 完成 您也许需要…

Java编程基础(第四篇:字符串初次介绍)

前言 HelloWorld写的多了&#xff0c;语法熟悉一点了吧&#xff0c;其中有段代码还没介绍&#xff0c;它就是字符串 public class HelloWorld { public static void main(String[] args) { printBaby(); } static void printBaby() { System.out.print("baby"); } } …