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
}
过程 及例子
#include <stdio.h>
int m=1;
void stooge(int A[], int i, int j)
{
printf("/nloop:%4d/n",m++);
printf("i=%d,j=%d: ",i,j);
printf("begin: stooge(A, %d, %d)/n",i,j);
if(A[i] > A[j])//首尾交换
{
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
if(i+1 >= j)
{
printf("end: stooge(A, %d, %d)/n",i,j);
return;
}
int k = (j-i+1)/3;
printf("i=%d,j=%d,k=%d: ",i,j,k);
printf("stooge(A, i, j-k); stooge(A, %d, %d)/n",i,j-k);
stooge(A, i, j-k);// 递归调用前 2/3
printf("i=%d,j=%d,k=%d: ",i,j,k);
printf("stooge(A, i+k, j); stooge(A, %d, %d)/n",i,j-k);
stooge(A, i+k, j);// 递归调用后 2/3
printf("i=%d,j=%d,k=%d: ",i,j,k);
printf("stooge(A, i+k, j); stooge(A, %d, %d)/n",i,j-k);
stooge(A, i, j-k);// 递归调用前 2/3
printf("i=%d,j=%d,k=%d: ",i,j,k);
printf("end: stooge(A, %d, %d)/n",i,j-k);
}
int main(void)
{
int n[]={1,98,45,6,87},i;
//for(i=0;i<5;i++)
//printf("%d/n",n[i]);
stooge(n,0,4);
//for(i=0;i<5;i++)
//printf("%d/n",n[i]);
getchar();
return 0;
}