首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

求教个算法Stooge排序算法解决思路

2012-03-19 
求教个算法Stooge排序算法程序是用伪码写的,A代表数组,i,j都代表下标。想请问到底是怎么做到排序的exchange

求教个算法Stooge排序算法
程序是用伪码写的,A代表数组,i,j都代表下标。
想请问到底是怎么做到排序的
exchange 代表交换

[code=C/C++][/code]
STOOGE-SORT(A, i, j)
if A[i] > A[j]
  then exchange A[i]<--->A[j]
if i+1 >= j
  then return k = (j - i + 1)/3
STOOGE-SORT(A, i, j-k)
STOOGE-SORT(A, i+k, j)
STOOGE-SORT(A, i, j-k)

请教各位?

[解决办法]

C/C++ code
void stooge(int A[], int i, int j){    if(A[i] > A[j])//首尾交换    {        // exchange        int temp = A[i];        A[i] = A[j];        A[j] = temp;    }    if(i+1 >= j)        return;    int k = (j-i+1)/3;    stooge(A, i, j-k);// 递归调用前 2/3     stooge(A, i+k, j);// 递归调用后 2/3    stooge(A, i, j-k);// 递归调用前 2/3}
[解决办法]
好像算法导论里有这个算法。
属于交换排序,是对快排的划分方法的一个改进,不是划分为2个部分,而是划分为3个部分,从而提高排序性能。

STOOGE-SORT(A, i, j)
对数组A中第i个元素到第j个元素进行升序排序。
排序的思想:
1.使A[i]、A[J]有序。
2.对A中前2/3进行排序,使A中前2/3的元素保持升序。
3.对A中后2/3进行排序,使A中后2/3的元素保持升序。
至此可以知道,对后2/3排序后,会打乱中间1/3部分的元素顺序,从而使得前2/3无序。
4.再对前2/3进行排序,这时,整个数组中的元素即为有序。

递归出口,是只有两个元素时,这是很明显的。
[解决办法]
重新贴一下,注意每个begin都伴随一个end

C/C++ code
 

loop:  1
i=0,j=4: begin: stooge(A, 0, 4)
i=0,j=4,k=1: stooge(A, i, j-k); stooge(A, 0, 3)

loop:  2
i=0,j=3: begin: stooge(A, 0, 3)
i=0,j=3,k=1: stooge(A, i, j-k); stooge(A, 0, 2)

loop:  3
i=0,j=2: begin: stooge(A, 0, 2)
i=0,j=2,k=1: stooge(A, i, j-k); stooge(A, 0, 1)

loop:  4
i=0,j=1: begin: stooge(A, 0, 1)
end: stooge(A, 0, 1)
i=0,j=2,k=1: stooge(A, i+k, j); stooge(A, 0, 1)

loop:  5
i=1,j=2: begin: stooge(A, 1, 2)
end: stooge(A, 1, 2)
i=0,j=2,k=1: stooge(A, i+k, j); stooge(A, 0, 1)

loop:  6
i=0,j=1: begin: stooge(A, 0, 1)
end: stooge(A, 0, 1)
i=0,j=2,k=1: end: stooge(A, 0, 1)
i=0,j=3,k=1: stooge(A, i+k, j); stooge(A, 0, 2)

loop:  7
i=1,j=3: begin: stooge(A, 1, 3)
i=1,j=3,k=1: stooge(A, i, j-k); stooge(A, 1, 2)

loop:  8
i=1,j=2: begin: stooge(A, 1, 2)
end: stooge(A, 1, 2)
i=1,j=3,k=1: stooge(A, i+k, j); stooge(A, 1, 2)

loop:  9
i=2,j=3: begin: stooge(A, 2, 3)
end: stooge(A, 2, 3)
i=1,j=3,k=1: stooge(A, i+k, j); stooge(A, 1, 2)

loop:  10
i=1,j=2: begin: stooge(A, 1, 2)
end: stooge(A, 1, 2)
i=1,j=3,k=1: end: stooge(A, 1, 2)
i=0,j=3,k=1: stooge(A, i+k, j); stooge(A, 0, 2)

loop:  11
i=0,j=2: begin: stooge(A, 0, 2)
i=0,j=2,k=1: stooge(A, i, j-k); stooge(A, 0, 1)

loop:  12
i=0,j=1: begin: stooge(A, 0, 1)
end: stooge(A, 0, 1)
i=0,j=2,k=1: stooge(A, i+k, j); stooge(A, 0, 1)

loop:  13
i=1,j=2: begin: stooge(A, 1, 2)
end: stooge(A, 1, 2)
i=0,j=2,k=1: stooge(A, i+k, j); stooge(A, 0, 1)

loop:  14
i=0,j=1: begin: stooge(A, 0, 1)
end: stooge(A, 0, 1)
i=0,j=2,k=1: end: stooge(A, 0, 1)
i=0,j=3,k=1: end: stooge(A, 0, 2)
i=0,j=4,k=1: stooge(A, i+k, j); stooge(A, 0, 3)

loop:  15
i=1,j=4: begin: stooge(A, 1, 4)
i=1,j=4,k=1: stooge(A, i, j-k); stooge(A, 1, 3)

loop:  16
i=1,j=3: begin: stooge(A, 1, 3)
i=1,j=3,k=1: stooge(A, i, j-k); stooge(A, 1, 2)

loop:  17
i=1,j=2: begin: stooge(A, 1, 2)
end: stooge(A, 1, 2)
i=1,j=3,k=1: stooge(A, i+k, j); stooge(A, 1, 2)

loop:  18
i=2,j=3: begin: stooge(A, 2, 3)


end: stooge(A, 2, 3)
i=1,j=3,k=1: stooge(A, i+k, j); stooge(A, 1, 2)

loop:  19
i=1,j=2: begin: stooge(A, 1, 2)
end: stooge(A, 1, 2)
i=1,j=3,k=1: end: stooge(A, 1, 2)
i=1,j=4,k=1: stooge(A, i+k, j); stooge(A, 1, 3)

loop:  20
i=2,j=4: begin: stooge(A, 2, 4)
i=2,j=4,k=1: stooge(A, i, j-k); stooge(A, 2, 3)

loop:  21
i=2,j=3: begin: stooge(A, 2, 3)
end: stooge(A, 2, 3)
i=2,j=4,k=1: stooge(A, i+k, j); stooge(A, 2, 3)

loop:  22
i=3,j=4: begin: stooge(A, 3, 4)
end: stooge(A, 3, 4)
i=2,j=4,k=1: stooge(A, i+k, j); stooge(A, 2, 3)

loop:  23
i=2,j=3: begin: stooge(A, 2, 3)
end: stooge(A, 2, 3)
i=2,j=4,k=1: end: stooge(A, 2, 3)
i=1,j=4,k=1: stooge(A, i+k, j); stooge(A, 1, 3)

loop:  24
i=1,j=3: begin: stooge(A, 1, 3)
i=1,j=3,k=1: stooge(A, i, j-k); stooge(A, 1, 2)

loop:  25
i=1,j=2: begin: stooge(A, 1, 2)
end: stooge(A, 1, 2)
i=1,j=3,k=1: stooge(A, i+k, j); stooge(A, 1, 2)

loop:  26
i=2,j=3: begin: stooge(A, 2, 3)
end: stooge(A, 2, 3)
i=1,j=3,k=1: stooge(A, i+k, j); stooge(A, 1, 2)

loop:  27
i=1,j=2: begin: stooge(A, 1, 2)
end: stooge(A, 1, 2)
i=1,j=3,k=1: end: stooge(A, 1, 2)
i=1,j=4,k=1: end: stooge(A, 1, 3)
i=0,j=4,k=1: stooge(A, i+k, j); stooge(A, 0, 3)

loop:  28
i=0,j=3: begin: stooge(A, 0, 3)
i=0,j=3,k=1: stooge(A, i, j-k); stooge(A, 0, 2)

loop:  29
i=0,j=2: begin: stooge(A, 0, 2)
i=0,j=2,k=1: stooge(A, i, j-k); stooge(A, 0, 1)

loop:  30
i=0,j=1: begin: stooge(A, 0, 1)
end: stooge(A, 0, 1)
i=0,j=2,k=1: stooge(A, i+k, j); stooge(A, 0, 1)

loop:  31
i=1,j=2: begin: stooge(A, 1, 2)
end: stooge(A, 1, 2)
i=0,j=2,k=1: stooge(A, i+k, j); stooge(A, 0, 1)

loop:  32
i=0,j=1: begin: stooge(A, 0, 1)
end: stooge(A, 0, 1)
i=0,j=2,k=1: end: stooge(A, 0, 1)
i=0,j=3,k=1: stooge(A, i+k, j); stooge(A, 0, 2)

loop:  33
i=1,j=3: begin: stooge(A, 1, 3)
i=1,j=3,k=1: stooge(A, i, j-k); stooge(A, 1, 2)

loop:  34
i=1,j=2: begin: stooge(A, 1, 2)
end: stooge(A, 1, 2)
i=1,j=3,k=1: stooge(A, i+k, j); stooge(A, 1, 2)

loop:  35
i=2,j=3: begin: stooge(A, 2, 3)
end: stooge(A, 2, 3)
i=1,j=3,k=1: stooge(A, i+k, j); stooge(A, 1, 2)

loop:  36
i=1,j=2: begin: stooge(A, 1, 2)
end: stooge(A, 1, 2)
i=1,j=3,k=1: end: stooge(A, 1, 2)
i=0,j=3,k=1: stooge(A, i+k, j); stooge(A, 0, 2)

loop:  37
i=0,j=2: begin: stooge(A, 0, 2)
i=0,j=2,k=1: stooge(A, i, j-k); stooge(A, 0, 1)

loop:  38
i=0,j=1: begin: stooge(A, 0, 1)
end: stooge(A, 0, 1)
i=0,j=2,k=1: stooge(A, i+k, j); stooge(A, 0, 1)

loop:  39
i=1,j=2: begin: stooge(A, 1, 2)
end: stooge(A, 1, 2)
i=0,j=2,k=1: stooge(A, i+k, j); stooge(A, 0, 1)

loop:  40
i=0,j=1: begin: stooge(A, 0, 1)
end: stooge(A, 0, 1)
i=0,j=2,k=1: end: stooge(A, 0, 1)
i=0,j=3,k=1: end: stooge(A, 0, 2)
i=0,j=4,k=1: end: stooge(A, 0, 3)

热点排行