Algorithm 需要:最好用C语言实现Bose Hibbard排序

Algorithm 需要:最好用C语言实现Bose Hibbard排序,algorithm,sorting,algol,Algorithm,Sorting,Algol,请告诉我一个正在工作的Bose Hibbard排序实现的代码,最好是C语言 我试图用C#实现这个算法,但我没有这个算法的副本。我仅有的一个示例是一个Fortran实现,它是Hibbard原始Algol版本的“自由翻译”(摘自ACM第10卷(1963年)p142-50的《简单排序算法》杂志,我也没有)。Fortran版本似乎有缺陷(它只进行1次比较,如果已经排序,则最终退出),因此我主要关注的是获得一个工作版本进行研究。从(从ACM数字图书馆下载的)的扫描PDF中,通过在Mac上复制粘贴OCR,然

请告诉我一个正在工作的Bose Hibbard排序实现的代码,最好是C语言

我试图用C#实现这个算法,但我没有这个算法的副本。我仅有的一个示例是一个Fortran实现,它是Hibbard原始Algol版本的“自由翻译”(摘自ACM第10卷(1963年)p142-50的《简单排序算法》杂志,我也没有)。Fortran版本似乎有缺陷(它只进行1次比较,如果已经排序,则最终退出),因此我主要关注的是获得一个工作版本进行研究。

从(从ACM数字图书馆下载的)的扫描PDF中,通过在Mac上复制粘贴OCR,然后手动清理(相当多):

程序三元排序(a,n);阵列a;整数n;开始整数j,L;
整数数组x,y[0:log2(n-1)];整数过程和(w);阵列w;
开始整数j,s;s:=0;对于j:=0,第1步直到L完成s:=s+w[j]×2↑J总和:=s
结束;程序比较;开始真正的w;
如果a[sum(x)]>a[sum(y)],则开始w:=a[sum(x)];a[总和(x)]:=a[总和(y)];
a[总和(y)]:=w结束;
L:=entierlog2(n-1);对于j:=0,第1步直到L开始x[j]:=0;
y[j]:=如果j=0,则1否则0结束;
A:比较;j:=0;
C:如果x[j]=y[j]=0,则转到0;如果x[j]=y[j]=1,则转到0;如果x[j]=y[j]=1,则转到1
如果x[j]=0,则前两个为其他两个;
零:x[j]:=y[j]:=1;若和(y)≤ n-1然后转到A;
一:y[j]:=0;去一家餐馆;
二:x[j]:=0;j:=j+1;去C;
前两个:x[j]:=y[j]:=0;如果j=L,则进入出口;j:=j+1;
如果y[j]=1,则转到D;x[j]:=y[j]:=1;如果和(y)>n-1,则
去前两个;如果和(y)
在原始版本中,“log2”函数设置为“log2”。换行符与原始换行符相同。这早于“结构化编程”革命——现在你可以明白为什么结构化编程是个好主意了。它也早于仔细、清晰的代码布局。看到“两个单词”的标签和过程名称是很有趣的。(PDF格式,或)它说:空白或换行等排版特征在参考语言中没有任何意义。但是,它们可以自由地用于方便阅读。这意味着在现代计算机语言中看似“两个词”的东西在Algol-60中只是一个词;用谷歌搜索表明,关键词是不同的通过加下划线、粗体印刷或加引号的方式从变量等中借用。该语言还使用了一些键盘上通常找不到的符号;该程序中的三个例子是“×”,”↑', 而且≤'.)

对于嵌套过程,您需要大量的“自由翻译”才能用Fortran编写代码

在这里,它被重新格式化了——也许更容易看到代码是什么;过多的“go to”语句并不能让它更容易理解。现在你可以明白为什么Dijkstra写了“GOTO被认为是有害的”

procedure ternary sort (a, n); array a; integer n; 
begin
    integer j, L;
    integer array x, y[0: log2(n-1)]; 
    integer procedure sum(w); array w;
    begin
        integer j, s; 
        s := 0; 
        for j:= 0 step 1 until L do s := s+w[j]×2↑j; 
        sum := s
    end;
    procedure compare;
    begin
        real w;
        if a[sum(x)] > a[sum(y)] then
        begin
            w := a[sum(x)]; 
            a[sum(x)] := a[sum(y)];
            a[sum(y)] := w 
        end 
    end;
    L := entier log2(n-1);
    for j := 0 step 1 until L do
    begin
        x[j] := 0;
        y[j] := if j = 0 then 1 else 0
    end;
A:  compare; j := 0;
C:  go to if x[j] = y[j] = 0 then zero
          else if x[j] = y[j] = 1 then one
          else if x[j] = 0 then first two 
          else two;
zero:
    x[j] := y[j] := 1;
    if sum(y) ≤ n-1 then go to A;
one:
    y[j] := 0; 
    go to A;
two:
    x[j] := 0; 
    j := j+1; 
    go to C;
first two:
    x[j] := y[j] := 0;
    if j = L then go to exit; 
    j := j+1;
    if y[j] = 1 then go to D; 
    x[j] := y[j] := 1; 
    if sum(y) > n-1 then go to first two; 
    if sum(y) < n-1 then j := 0;
D:  x[j] := 0;
    y[j] := 1; 
    go to A;
exit:
end
过程三值排序(a,n);数组a;整数n;
开始
整数j,L;
整数数组x,y[0:log2(n-1)];
整数过程和(w);数组w;
开始
整数j,s;
s:=0;
对于j:=0,第1步直到L完成s:=s+w[j]×2↑J
总和:=s
结束;
程序比较;
开始
真实w;
如果a[sum(x)]>a[sum(y)],则
开始
w:=a[和(x)];
a[总和(x)]:=a[总和(y)];
a[总和(y)]:=w
结束
结束;
L:=entierlog2(n-1);
对于j:=0第1步直到L do
开始
x[j]:=0;
y[j]:=如果j=0,则1等于0
结束;
A:比较;j:=0;
C:如果x[j]=y[j]=0,则转到0
否则,如果x[j]=y[j]=1,则为1
否则,如果x[j]=0,则前两个
另外两个;
零:
x[j]:=y[j]:=1;
若和(y)≤ n-1然后转到A;
一:
y[j]:=0;
去一家餐馆;
二:
x[j]:=0;
j:=j+1;
去C;
前两项:
x[j]:=y[j]:=0;
如果j=L,则进入出口;
j:=j+1;
如果y[j]=1,则转到D;
x[j]:=y[j]:=1;
如果总和(y)>n-1,则转到前两个;
如果和(y)
如果你在一所大学,它的电子图书馆订阅可能包含Hibbard的原创文章。@thkala很不幸,我不是。@Handcrafter:这个算法的名声是什么?与当前主流排序算法相比,它有什么特别的优点吗?+1用于OCR和清理。现在如果我们可以的话仅解开嵌套过程并计算gotos。在第26行,y[j]:=如果i=0,则1其他0应为y[j]:=如果j=0,则1其他0,因为第34行没有定义变量i,z[j]应为x[j]因为并没有数组z是用修正和一些旋转来定义的,所以我能够让它工作起来。谢谢!哇,这是人们在使用位运算符之前所做的。x[]和y[]只是1和0的数组,表示(在扩展二进制中)数组“a”中的两个索引;“compare”只是在这两个元素出现顺序错误时交换这两个元素;sum(x)[或求和(y)]将1和0转换为整数。最后的混乱是一种对x和y中的位进行排序的方法,以获得所有必需的元素对。因此,此代码中的大部分实际上不是排序的一部分,而是由于语言不允许只处理位而产生的开销。
procedure ternary sort (a, n); array a; integer n; 
begin
    integer j, L;
    integer array x, y[0: log2(n-1)]; 
    integer procedure sum(w); array w;
    begin
        integer j, s; 
        s := 0; 
        for j:= 0 step 1 until L do s := s+w[j]×2↑j; 
        sum := s
    end;
    procedure compare;
    begin
        real w;
        if a[sum(x)] > a[sum(y)] then
        begin
            w := a[sum(x)]; 
            a[sum(x)] := a[sum(y)];
            a[sum(y)] := w 
        end 
    end;
    L := entier log2(n-1);
    for j := 0 step 1 until L do
    begin
        x[j] := 0;
        y[j] := if j = 0 then 1 else 0
    end;
A:  compare; j := 0;
C:  go to if x[j] = y[j] = 0 then zero
          else if x[j] = y[j] = 1 then one
          else if x[j] = 0 then first two 
          else two;
zero:
    x[j] := y[j] := 1;
    if sum(y) ≤ n-1 then go to A;
one:
    y[j] := 0; 
    go to A;
two:
    x[j] := 0; 
    j := j+1; 
    go to C;
first two:
    x[j] := y[j] := 0;
    if j = L then go to exit; 
    j := j+1;
    if y[j] = 1 then go to D; 
    x[j] := y[j] := 1; 
    if sum(y) > n-1 then go to first two; 
    if sum(y) < n-1 then j := 0;
D:  x[j] := 0;
    y[j] := 1; 
    go to A;
exit:
end