【30】非递归方法实现快速排序

简介: 1. 最简单的实现快速排序的方法是利用递归来实现,如果要利用非递归的方法实现2. 非递归的实现快速排序,可以利用栈来实现。其实递归的本质就是栈的先进后出的性质。


1. 最简单的实现快速排序的方法是利用递归来实现,如果要利用非递归的方法实现


2. 非递归的实现快速排序,可以利用栈来实现。其实递归的本质就是栈的先进后出的性质。

    利用快速排序每次是递归向左右子序列中进行排序,利用栈我们可以把左右子序列的端点值保存到栈中,然后每次取栈顶区间进行排序,直到栈为空则整个序列为有序


3. 代码

#include<stack>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

//Partition函数
int Partition(int *arrNum, int l, int r){
     //数据不合法
	 if(arrNum == NULL || l > r){
         return -1;
     } 
     int mid = (l+r)>>1;
     swap(arrNum[mid], arrNum[r]);
     int leftSeqIndex = l;
     //扫描 
	 for(int i = l; i < r; i++){
	     if(arrNum[i] < arrNum[r]){
             if(i > leftSeqIndex){
  			     swap(arrNum[i], arrNum[leftSeqIndex]);
      		 }
      		 ++leftSeqIndex;
         }
     }
     swap(arrNum[leftSeqIndex], arrNum[r]);
     return leftSeqIndex;
} 

//非递归实现快速排序
void QuickSort(int *arrNum, int n){
	 //如果数据不合法 
	 if(arrNum == NULL || n <= 0){
         return;
     }
     //栈用来保存区间两个端点 
	 stack<pair<int,int> >stk;
     stk.push(make_pair(0, n-1));
     //栈不为空则继续排序 
	 while(!stk.empty()){
         pair<int,int> seq = stk.top();
         stk.pop();
         int index = Partition(arrNum, seq.first, seq.second); 
		 //返回的是-1说明无效数据 
		 if(index == -1){
             return;
		 }
		 if(index > seq.first){
	         stk.push(make_pair(seq.first, index-1));
	     }
	     if(index < seq.second){
 		     stk.push(make_pair(index+1, seq.second));
	     }
	 }
}
 

int main(){
    int arrNum[] = {0,9,-1,6,7,3,5};
    QuickSort(arrNum, 7); 
    for(int i = 0; i < 7; i++)
        cout<<arrNum[i]<<" ";
    cout<<endl;
    getchar();
    return 0;
}
/*
输出 
-1 0 3 5 6 7 9
*/



目录
相关文章
|
XML 前端开发 Java
Spring MVC 父子容器是什么?这篇文章讲清楚了
Spring MVC 父子容器是初学 Spring MVC 时最先接触到 Spring 知识点之一,还记得我刚工作那会,项目基础架构是其他同事搭建的,其中就用到了 Spring MVC 中的父子容器,还把 Spring MVC 中的不同层拆成了不同的 maven 模块。这里暂不讨论这种模块拆分方式的优劣,Spring 为什么设计出具有层次结构的容器呢?Web 环境中什么场景会用到这种具有层次结构的容器?
664 0
Spring MVC 父子容器是什么?这篇文章讲清楚了
|
自然语言处理 算法 数据挖掘
自蒸馏:一种简单高效的优化方式
背景知识蒸馏(knowledge distillation)指的是将预训练好的教师模型的知识通过蒸馏的方式迁移至学生模型,一般来说,教师模型会比学生模型网络容量更大,模型结构更复杂。对于学生而言,主要增益信息来自于更强的模型产出的带有更多可信信息的soft_label。例如下右图中,两个“2”对应的hard_label都是一样的,即0-9分类中,仅“2”类别对应概率为1.0,而soft_label
自蒸馏:一种简单高效的优化方式
|
NoSQL Redis 数据库
深入理解redis cluster的failover机制
社区版redis cluster是无中心节点P2P的集群架构,内部采用gossip协议传递维护集群的拓扑结构和集群元数据。社区文档地址:https://redis.io/topics/cluster-tutorial failover是redis cluster提供的容错机制,cluster最核心的功能之一。
13278 0
|
SQL 关系型数据库 MySQL
MySql 索引失效、回表解析
MySql 索引失效、回表解析
265 1
MySql 索引失效、回表解析
WK
|
5月前
|
机器学习/深度学习 Java 程序员
为什么Python比C++慢很多?
Python相较于C++较慢主要体现在:动态类型系统导致运行时需解析类型,增加开销;作为解释型语言,逐行转换字节码的过程延长了执行时间;自动内存管理和垃圾回收机制虽简化操作但也带来了额外负担;全局解释器锁(GIL)限制了多线程性能;尽管Python库方便灵活,但在性能上往往不及C++底层库。然而,Python在某些领域如数据分析、机器学习中,凭借其高级别抽象和简洁语法仍表现出色。选语言需依据具体应用场景和需求综合考量。
WK
138 1
|
存储 C++ 异构计算
|
6月前
|
开发者 C# 容器
【独家揭秘】当WPF邂逅DirectX:看这两个技术如何联手打造令人惊艳的高性能图形渲染体验,从环境搭建到代码实践,一步步教你成为图形编程高手
【8月更文挑战第31天】本文通过代码示例详细介绍了如何在WPF应用中集成DirectX以实现高性能图形渲染。首先创建WPF项目并使用SharpDX作为桥梁,然后在XAML中定义承载DirectX内容的容器。接着,通过C#代码初始化DirectX环境,设置渲染逻辑,并在WPF窗口中绘制图形。此方法适用于从简单2D到复杂3D场景的各种图形处理需求,为WPF开发者提供了高性能图形渲染的技术支持和实践指导。
414 0
|
机器学习/深度学习 存储 人工智能
AI绘画专栏之 SDXL 4G显存就能跑SDXL ?SD1.7或将对F8优化merge(46)
AI绘画专栏之 SDXL 4G显存就能跑SDXL ?SD1.7或将对F8优化merge(46)
278 0
|
Web App开发 XML iOS开发
Tiktok 根据主播id(uniqueId)获取个人详细信息
Tiktok 根据主播id(uniqueId)获取个人详细信息
|
机器学习/深度学习 存储 计算机视觉
【论文速递】TPAMI2022 - 自蒸馏:迈向高效紧凑的神经网络
【论文速递】TPAMI2022 - 自蒸馏:迈向高效紧凑的神经网络
936 0

热门文章

最新文章