您知道最模糊的排序算法是什么?[关闭]


22

我刚刚通过sortvis.org博客文章阅读了有关cyclesort的文章。这可能是迄今为止我所听说过的最晦涩的一种语言,因为它使用的是我不熟悉的数学(检测整数集置换中的周期)。

您所知道的最晦涩的是什么?


4
必须回来阅读。
Mark C 2010年

很好的时机,我的数据结构类刚刚开始涵盖各种类型。现在,我不仅了解基本种类,而且也了解疯狂的种类。
杰森

Answers:



12

Slowsort通过乘和投降来工作(与分而治之相反)。有趣的是,它被证明是可以构建的效率最低的排序算法(渐近,并且受限于这种算法虽然很慢,但仍必须始终始终朝着结果努力)。

这使它与bogosort偏离了,因为在最佳情况下,bogosort的效率很高-也就是说,当数组已经排序时。Slowsort不会遭受这种最佳情况的“折磨”。即使在最好的情况下,它仍然有运行时间$ \ Omega(n ^ \ frac {\ log_2n} {2+ \ epsilon})$ε > 0。

这是它的伪代码,改编自德国维基百科的文章

function slowsort(A, i, j):
  if i >= j: return

  m = (i + j) / 2
  slowsort(A, i, m)
  slowsort(A, m + 1, j)

  if A[j] < A[m]:
    swap(A[j], A[m])

  slowsort(A, i, j - 1)

1
在最佳情况下,可以通过逆转Bogosort的步​​骤顺序使其变得更加琐碎:首先是洗牌。如果已排序,则停止。
Alex Feinman 2010年

3
@Alex:不。那没有任何改变。Bogosort 仍将在第一步之后完成,因为有机会,改组将对序列进行排序。Bogosort仍然表现出明显的最佳情况,其运行时间(O(n))与最坏情况和平均情况根本不同。Slowsort根本没有这个。
康拉德·鲁道夫

啊,我只考虑初始条件,不考虑执行路径!
Alex Feinman 2010年

喜欢这个:)就像蛮力...

8

我不知道这是否算是晦涩难懂,但是Bogosort是最荒谬的排序“算法” 之一。Bogosort页面上的链接也很有趣。

这是“量子bogo-sort”部分中的一颗宝石。

可以说,创建2 N个 Universe也是非常占用内存的。

嗯...你可以这样说:-)。


我喜欢这一个。我特别喜欢“ Quantum bogosort”的想法:-)
Dean Harding

6

另一个晦涩的“算法”是智能设计排序 -但是没有一种算法可以更快或更节省内存:)


该算法的最佳功能之一就是我们只知道它可以工作-无需分析或证明任何东西。
Caleb

6

睡眠排序相当新颖。

    #!/bin/bash
    function f() {
        sleep "$1"
        echo "$1"
    }
    while [ -n "$1" ]
    do
        f "$1" &
        shift
    done
    wait

用法示例:

    ./sleepsort.bash 5 3 6 3 6 3 1 4 7


3

在其中一个练习的答案中,Knuth第3卷1提供了一种无名排序算法的实现,该算法基本上是一种古老的代码高尔夫-您可以用MIX汇编语言编写的最短排序。短代码确实是以O(N 3)复杂度的极小的代价来实现的...

1至少在旧版本中。考虑到新版本对MIXAL所做的修改,我不确定它是否仍然存在,甚至不确定原始MIXAL中的意义。



2

我不知道它是否是最晦涩的,但是在可以使用它的情况下,意大利面排序是最好的之一。


这在概念上与“睡眠排序”非常相似,并且有趣的是,生物信息学中已使用它们对DNA进行测序(Sanger测序)。
康拉德·鲁道夫

2

克努斯(Knuth)的原始著作之一“排序和搜索”(Sorting and Searching)具有中间折页,该折页图解了一个不使用硬盘对磁带文件进行排序的过程。我认为它使用了六个磁带驱动器,并明确显示了何时正向读取,向后读取,倒带或空闲。今天,它已成为过时技术的纪念碑。


1

我曾经在CRAY汇编器中进行过向量寄存器气泡排序。该机器具有双移位指令,使您可以将向量寄存器的内容上/下移动一个字。将其他所有点都放在两个向量寄存器中,然后您就可以进行完整的冒泡排序,而无需完成另一个内存引用。除了气泡排序的N ** 2性质,它还是有效的。

我还曾经需要对单个排序的长度为4的矢量进行浮点排序。是通过表查找完成的(A2-A1的符号位为一位,A3-A1的符号位为另一位...,然后您在表中查找排列向量。这实际上是我能想到的最快的解决方案但是,在浮点数和整数单元之间过于分开,因此在现代体系结构上效果不佳。


您仍然有这个来源吗?我有兴趣检查一下!
sova 2010年

没有消息来源,这是因为一台最终淘汰我的公司的旧机器。查表并不难:sb1 = 1&(((a2-a1)>> 63); sb2 = 2&((a3-a1)>> 62); ... index = sb1 | sb2 | sb3 ...通过订单的表查找。
Omega Centauri 2010年

1

Google Code Jam有一个关于名为Gorosort的算法的问题,我认为他们是为此发明的。

五郎有4臂。五郎很强壮。你不会和五郎在一起的。Goro需要对N个不同整数的数组进行排序。算法不是Goro的优势;实力就是五郎的实力。Goro的计划是用两只手的手指按住阵列中的几个元素,并尽可能用第三和第四拳头击打桌子。这将使阵列中不固定的元素飞到空中,随机洗牌,然后掉落到空的阵列位置。

http://code.google.com/codejam/contest/dashboard?c=975485#s=p3


0

不记得这个名字了,但是基本上

while Array not sorted

  rearrange the array in a random order

这是bogosort,在其他答案中提到。
MatrixFrog 2011年

0

贝壳类

也许算法本身并不那么晦涩,但谁能说出实际中实际使用的实现呢?我可以!

TIGCC(用于TI-89 / 92 / V200图形计算器的基于GCC的编译器)qsort在其标准库中使用Shell排序实现:

__ATTR_LIB_C__ void qsort(void *list, short num_items, short size, compare_t cmp_func)
{
  unsigned short gap,byte_gap,i,j;                
  char *p,*a,*b,temp;                       
  for (gap=((unsigned short)num_items)>>1; gap>0; gap>>=1)    // Yes, this is not a quicksort,
    {                                                         // but works fast enough...    
      byte_gap=gap*(unsigned short)size;
      for(i=byte_gap; i<((unsigned short)num_items)*(unsigned short)size; i+=size)
        for(p=(char*)list+i-byte_gap; p>=(char*)list; p-= byte_gap)
          {
            a=p; b=p+byte_gap;
            if(cmp_func(a,b)<=0) break;
            for(j=size;j;j--)
              temp=*a, *a++=*b, *b++=temp;
          }
    }
}

选择shell排序是为了支持quicksort,以使代码尺寸较小。尽管渐进复杂性更差,但TI-89并没有太多的RAM(190K,减去程序大小和所有未归档变量的总大小),因此可以肯定地说,项目数量会低。

在我抱怨自己编写的程序太慢之后,编写了一个更快的实现。它使用更好的间隙尺寸以及装配优化。可以在这里找到:qsort.c

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.