Stooge排序算法

来源:互联网 发布:苏州php开发 编辑:程序博客网 时间:2024/06/05 17:27

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;
}