新的排序算法——栈排序
xingjielongSYH · · 算法·理论
前言
栈排序最初于2024年某日由作者独自完成,后学习知识,分析算法,成此文章。
2020/12/15第一稿
2020/12/20修改部分内容
简要说明一下,本算法没有太好的时空复杂度,但有微乎其微的优点
算法流程
- 建立3个栈(本文使用手写栈)
a,b,c ,a 为"杂栈",b 为"单调栈",c 为总栈(原数组),初始数组元素全在栈c 中。 - 遍历
c 栈顶,若b 栈为空或栈顶元素小于c 栈顶,则将c 栈顶元素移至b 栈顶,否则移至a 栈顶。 - 此时若栈
a 为空,退出循环,由底至顶输出栈b 即为答案。 - 否则将栈
b ,栈a 由顶至底移回栈c \ \ 压行代码如下(移动了第3步和第4步的位置)void stack_sort(int* l,int* r){ // [l,r) int a[r-l],b[r-l],*c=l; //初始化 int la=0,lb=0,lc=r-l; while(la || !lb){ //第三步,注意防止初始化完直接退出 while(lb)c[lc++]=b[--lb]; //第四步 while(la)c[lc++]=a[--la]; while(lc){ //第一步 if(!lb || c[lc-1]>=b[lb-1])b[lb++]=c[--lc]; else a[la++]=c[--lc]; } } for(int i=0;i<lb;i++)*(l+i)=b[i]; //第三步 }
算法原理
设在上一轮操作最后,栈这不就是选择排序的变种嘛
算法分析
空间复杂度:没什么好说的,
if(!lb || c[lc-1]>=b[lb-1])
最低时间复杂度:
冒泡排序 O(n^2):
3320ms
选择排序 O(n^2):
1031ms
快速排序 O(n log n):
1ms
栈排序 O(n^2):
3203ms
可以看出,时间不如选择排序\
该算法理论时间比选择排序略优,只是常数较大,约是选择排序的6倍
鸣谢
鸣谢TH911,为算法的分析做出贡献。\ 鸣谢选择排序发明者,提供算法最初的灵感。