鱼C论坛

 找回密码
 立即注册
查看: 3386|回复: 3

[技术交流] 【C++板块提升计划】C++快排【非递归形式】

[复制链接]
发表于 2022-10-19 21:07:54 | 显示全部楼层 |阅读模式
本帖最后由 zhangjinxuan 于 2023-3-3 21:25 编辑

最近闲来无事,写了一个非递归形式的快排

思路很简单,递归使用栈的,对吧,那么我们模拟一下栈就可以啦~

代码:
  1. #include <bits/stdc++.h>
  2. using namespace std;

  3. int st[10001][2], top, n, a[10001];

  4. int main() {
  5.         scanf("%d", &n);
  6.         for (int i = 1; i <= n; ++i)
  7.                 scanf("%d", &a[i]);
  8.         st[++top][0] = 1;
  9.         st[top][1] = n;
  10.         while (top) {
  11.                 int l = st[top][0], r = st[top--][1];
  12.                 if (l >= r) continue;
  13.                 int t = a[l], i = l, j = r;
  14.                 while (i <= j) {
  15.                         while (i <= j && a[i] < t) ++i;
  16.                         while (i <= j && a[j] > t) --j;
  17.                         if (i <= j) swap(a[i++], a[j--]);
  18.                 }
  19.                 st[++top][0] = l, st[top][1] = j;
  20.                 st[++top][0] = i, st[top][1] = r;
  21.         }
  22.         for (int i = 1; i <= n; ++i)
  23.                 printf("%d ", a[i]);
  24. }
复制代码


这个故事告诉我们:递归真的全都可以写为栈(非递归,循环)的形式,循环时只要把递归所用到的参数加到栈里面就行了~

归根到底,递归其实就是用到了栈

但是,大家觉得 非递归形式的快排 是比 递归形式的快排 快了,还是慢了?欢迎大家投票~

单选投票, 共有 2 人参与投票
您所在的用户组没有投票权限
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-10-19 21:10:57 | 显示全部楼层
我觉得非递归形式要快,因为一个函数的开销很大,可能几十字节,不如我记两个int一共8字节
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-10-19 21:33:33 | 显示全部楼层
本文原创啊,如果有雷同那真的是巧合,巧合
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-12 09:33:07 | 显示全部楼层
最终,非递归的快排比stl的快排还要快
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-23 06:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表