我刚刚通过sortvis.org博客文章阅读了有关cyclesort的文章。这可能是迄今为止我所听说过的最晦涩的一种语言,因为它使用的是我不熟悉的数学(检测整数集置换中的周期)。
您所知道的最晦涩的是什么?
我刚刚通过sortvis.org博客文章阅读了有关cyclesort的文章。这可能是迄今为止我所听说过的最晦涩的一种语言,因为它使用的是我不熟悉的数学(检测整数集置换中的周期)。
您所知道的最晦涩的是什么?
Answers:
Slowsort通过乘和投降来工作(与分而治之相反)。有趣的是,它被证明是可以构建的效率最低的排序算法(渐近,并且受限于这种算法虽然很慢,但仍必须始终始终朝着结果努力)。
这使它与bogosort偏离了,因为在最佳情况下,bogosort的效率很高-也就是说,当数组已经排序时。Slowsort不会遭受这种最佳情况的“折磨”。即使在最好的情况下,它仍然有运行时间 为ε > 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)
我不知道这是否算是晦涩难懂,但是Bogosort是最荒谬的排序“算法” 之一。Bogosort页面上的链接也很有趣。
这是“量子bogo-sort”部分中的一颗宝石。
可以说,创建2 N个 Universe也是非常占用内存的。
嗯...你可以这样说:-)。
我认为在这种情况下,气泡排序也是错误的答案
:)
对于我的数据结构类,我不得不(明确地)证明Stooge sort的正确性。它的运行时间为O(n ^ {log 3 / log 1.5})= O(n ^ 2.7095 ...)。
我曾经在CRAY汇编器中进行过向量寄存器气泡排序。该机器具有双移位指令,使您可以将向量寄存器的内容上/下移动一个字。将其他所有点都放在两个向量寄存器中,然后您就可以进行完整的冒泡排序,而无需完成另一个内存引用。除了气泡排序的N ** 2性质,它还是有效的。
我还曾经需要对单个排序的长度为4的矢量进行浮点排序。是通过表查找完成的(A2-A1的符号位为一位,A3-A1的符号位为另一位...,然后您在表中查找排列向量。这实际上是我能想到的最快的解决方案但是,在浮点数和整数单元之间过于分开,因此在现代体系结构上效果不佳。
Google Code Jam有一个关于名为Gorosort的算法的问题,我认为他们是为此发明的。
五郎有4臂。五郎很强壮。你不会和五郎在一起的。Goro需要对N个不同整数的数组进行排序。算法不是Goro的优势;实力就是五郎的实力。Goro的计划是用两只手的手指按住阵列中的几个元素,并尽可能用第三和第四拳头击打桌子。这将使阵列中不固定的元素飞到空中,随机洗牌,然后掉落到空的阵列位置。
http://code.google.com/codejam/contest/dashboard?c=975485#s=p3
不记得这个名字了,但是基本上
while Array not sorted
rearrange the array in a random order
也许算法本身并不那么晦涩,但谁能说出实际中实际使用的实现呢?我可以!
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