【非递归】手搓快速排序

简介: 【非递归】手搓快速排序

前言:

快速排序已经带大家实现过了,我们用到的方法是递归法,你知道吗,用循环也可以实现快速排序,来看看吧。

注:

这篇博客属于数据结构内容,建议学习完C语言的小伙伴食用~


目录

🐯1.快排回顾

🦁2.非递归思想

🐮3.实现



1.快排回顾


还记得递归版的快速排序是怎么实现的吗?

默认使用前后指针法:

7963524f7152b42094d3fadd784ad9cc_e606e402b8844ad38d7003d3f314f27b.gif

代码实现:

//快排(前后指针法)
void QuickSort3(int* a, int left, int right)
{
  if (left >= right)
    return;
  //三数取中
  int midi = GetMidi(a, left, right);
  if (midi != left)
      Swap(&a[midi], &a[left]);
  int keyi = left;
  int key = a[left];
  int prev = left;
  int cur = left + 1;
  while (cur <= right)
  {
    if (a[cur] < key && ++prev != cur)
      Swap(&a[cur], &a[prev]);
    cur++;
  }
  Swap(&a[keyi], &a[prev]);//与下标为keyi的交换
  keyi = prev;
  //递归
  QuickSort3(a, left, keyi - 1);
  QuickSort3(a, keyi + 1, right);
}

在代码末尾进行了递归操作,那么非递归如何实现呢?


2.非递归思想


要想用非递归实现排序,我们首先要观察递归是如何实现的:

不变的是一趟中数字的交换逻辑,

变化的是需要进行 调整的区间

我们从变化的入手:

20522d165e4e678506bff0b4c6cabede_ce1b38db58dd4ed18dbf439eeeb198f7.png

可以看到,调整的区间在变化(紫色标号);

也就是说,我们可以在循环中 存储要调整的区间 ,用到时再取出来;

这个有先入后出的特点,可以选择栈来实现。

那么如何模拟返回条件呢?

递归版是一个数字的时候就返回,那么非递归版就可以是子区间有一个值或者没有值就不把区间入栈。


思路总结:

里面取一段区间,单趟排序;

• 单趟分割子区间入栈;

• 子区间只有一个值或者不存在就不入栈


3.实现


void QuickSortNotR(int* a, int left, int right)
{
  Stack ST;
  StackInit(&ST);
  StackPush(&ST, right); // 先入右,再入左,才能先出左,再出右。
  StackPush(&ST, left);
  while (!StackEmpty(&ST))
  {
        // 取出区间
    int begin = StackTop(&ST);
    StackPop(&ST);
    int end = StackTop(&ST);
    StackPop(&ST);
        // PartSort3返回是快速排序的keyi值
    int keyi = PartSort3(a, begin, end);
    //[begin,keyi-1] keyi [keyi+1,end]
        //满足非一零就出栈
    if (keyi + 1 < end)
    {
      StackPush(&ST, end);
      StackPush(&ST, keyi + 1);
    }
    if (begin < keyi - 1)
    {
      StackPush(&ST, keyi - 1);
      StackPush(&ST, begin);
    }
  }
  StackDestroy(&ST);
}

总结:

这篇博客内容比较简单,就是仿照递归版本实现了非递归的快速排序。

目录
相关文章
2024届通义校园招聘正式启动
2024届通义校园招聘正式启动
1696 0
|
2天前
|
数据采集 人工智能 安全
|
11天前
|
云安全 监控 安全
|
3天前
|
自然语言处理 API
万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
1021 151
|
3天前
|
编解码 人工智能 机器人
通义万相2.6,模型使用指南
智能分镜 | 多镜头叙事 | 支持15秒视频生成 | 高品质声音生成 | 多人稳定对话
|
17天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1719 9
|
8天前
|
人工智能 自然语言处理 API
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸
一句话生成拓扑图!next-ai-draw-io 结合 AI 与 Draw.io,通过自然语言秒出架构图,支持私有部署、免费大模型接口,彻底解放生产力,绘图效率直接爆炸。
660 152
|
10天前
|
人工智能 安全 前端开发
AgentScope Java v1.0 发布,让 Java 开发者轻松构建企业级 Agentic 应用
AgentScope 重磅发布 Java 版本,拥抱企业开发主流技术栈。
625 13