鱼C论坛

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

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

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

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

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

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

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

int main() {
        scanf("%d", &n);
        for (int i = 1; i <= n; ++i)
                scanf("%d", &a[i]); 
        st[++top][0] = 1;
        st[top][1] = n;
        while (top) {
                int l = st[top][0], r = st[top--][1];
                if (l >= r) continue;
                int t = a[l], i = l, j = r;
                while (i <= j) {
                        while (i <= j && a[i] < t) ++i;
                        while (i <= j && a[j] > t) --j;
                        if (i <= j) swap(a[i++], a[j--]);
                }
                st[++top][0] = l, st[top][1] = j;
                st[++top][0] = i, st[top][1] = r;
        }
        for (int i = 1; i <= n; ++i)
                printf("%d ", a[i]);
}

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

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

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

单选投票, 共有 2 人参与投票
您所在的用户组没有投票权限
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-10-19 21:10:57 | 显示全部楼层
我觉得非递归形式要快,因为一个函数的开销很大,可能几十字节,不如我记两个int一共8字节
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-10-19 21:33:33 | 显示全部楼层
本文原创啊,如果有雷同那真的是巧合,巧合
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-12 09:33:07 | 显示全部楼层
最终,非递归的快排比stl的快排还要快
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-26 21:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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