Algorithm 配料器&x27;s奇偶合并排序
嗨,我有一个关于Batcher奇偶合并排序的问题。我有以下代码:Algorithm 配料器&x27;s奇偶合并排序,algorithm,sorting,mergesort,Algorithm,Sorting,Mergesort,嗨,我有一个关于Batcher奇偶合并排序的问题。我有以下代码: public class Batcher { public static void batchsort(int a[], int l, int r) { int n = r-l+1; for (int p=1; p<n; p+=p) for (int k=p; k>0; k/=2) for (int j=k%p; j+k<n; j+=(k+k))
public class Batcher {
public static void batchsort(int a[], int l, int r) {
int n = r-l+1;
for (int p=1; p<n; p+=p)
for (int k=p; k>0; k/=2)
for (int j=k%p; j+k<n; j+=(k+k))
for (int i=0; i<n-j-k; i++)
if ((j+i)/(p+p) == (j+i+k)/(p+p))
exch(a, l+j+i, l+j+i+k);
}
public static void main(String[] args) {
int a[] = new int[] {2, 4, 3, 4, 6, 5, 3};
batchsort(a, 0, a.length - 1);
for (int i=0; i<a.length; i++) {
System.out.println(a[i]);
}
}
public static void exch(int a[], int i, int j) {
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
我错过了什么?怎么了?我不知道算法,但在切换值之前,您需要比较批排序中的值,例如
if ((j + i) / (p + p) == (j + i + k) / (p + p))
{
if (a[l + j + i] > a[l + j + i + k])
{
exch(a, l + j + i, l + j + i + k);
}
}
或者,如果您对组合索引使用临时变量,则可读性可能更高,例如
if ((j + i) / (p + p) == (j + i + k) / (p + p))
{
int i1 = l + j + i;
int i2 = l + j + i + k;
if (a[i1] > a[i2])
{
exch(a, i1, i2);
}
}
但是上面的评论是对的——这篇文章写得真的不太容易。您应该尝试确保相等的大括号具有相同的缩进,嵌套的for()具有比其包含的for更多的缩进,等等,并且您可能还应该选择更多描述性变量名。'*这假设数组()是全局可用的
'* this assumes array() is globally available
'* Batcher Odd-even mergesort is limited to power of 2 size arrays. it will
'* malfunction in any other case. coded from c source by codeguy (qb64.net)
SUB batcherOddEvenMergeSort (Start&, Finish&)
IF (Finish& > 1) THEN
m& = (Finish&) \ 2
batcherOddEvenMergeSort Start&, m&
batcherOddEvenMergeSort Start& + m&, m&
batcheroddEvenMerge Start&, Finish&, 1
END IF
END SUB
SUB batcheroddEvenMerge (Start&, Finish&, r&)
m& = r& * 2
IF m& > 0 AND m& < Finish& THEN
batcheroddEvenMerge Start&, Finish&, m&
batcheroddEvenMerge Start& + r&, Finish&, m&
i& = Start& + r&
DO
IF i& + m& > Start& + Finish& THEN
EXIT DO
ELSE
IF array(i&) > array(i& + r&) THEN
swap array(i&), array(i& + r&)
END IF
i& = i& + m&
END IF
LOOP
ELSE
IF array(Start&) > array(Start& + r&) THEN
swap array(Start&), array(Start& + r&)
END IF
END IF
END SUB
'* this is adapted from c code and works correctly
'*Batcher奇偶合并排序限制为2个大小数组的幂次。会的
“*在任何其他情况下出现故障。由codeguy(qb64.net)从c源代码进行编码
子批次ERODEVENMERGESORT(开始和结束和结束)
如果(完成&>1),则
m&=(完成&)\2
BatcherAddEventMergeSort开始(&m)&
BatcherAddEventMergeSort开始&+m&,m&
BatcherAddEventMerge开始和结束和1
如果结束
端接头
子批次ERODEVENMERGE(开始和结束和结束)
m&=r&*2
如果m&>0和m&开始&+Finish&然后
退出DO
其他的
如果数组(i&)>数组(i&+r&),那么
交换数组(i&)、数组(i&+r&)
如果结束
i&=i&+m&
如果结束
环
其他的
如果数组(Start&)>数组(Start&+r&),那么
交换数组(开始&)、数组(开始&+r&)
如果结束
如果结束
端接头
“*这是根据c代码改编的,工作正常
这是一个固定的子例程
void sort(int n)
{
for (int p = 1; p < n; p += p)
for (int k = p; k > 0; k /= 2)
for (int j = k % p; j + k < n; j += k + k)
//for (int i = 0; i < n - (j + k); i++) // wrong line
for (int i = 0; i < k; i++)
if ((i + j)/(p + p) == (i + j + k)/(p + p))
printf("%2i cmp %2i\n", i + j, i + j + k);
}
void排序(int n)
{
对于(int p=1;p0;k/=2)
对于(int j=k%p;j+k
您错过了正确缩进的课程。因此,您的缩进是错误的。对不起,请给我们上正确缩进的一课?请尝试正确格式化您的代码-这样可以更容易地发现错误。如果可能的话,请尽量格式化。有什么想法吗?这段代码来自。程序11.4提供了非递归奇偶合并排序,但构建的排序网络与图11.7不同。您是否测试了网络的正确性?
void sort(int n)
{
for (int p = 1; p < n; p += p)
for (int k = p; k > 0; k /= 2)
for (int j = k % p; j + k < n; j += k + k)
//for (int i = 0; i < n - (j + k); i++) // wrong line
for (int i = 0; i < k; i++)
if ((i + j)/(p + p) == (i + j + k)/(p + p))
printf("%2i cmp %2i\n", i + j, i + j + k);
}