关于就地排序的问题

时间:2010-05-30 13:17:02

标签: algorithm

例如,我们有以下数组:

char data[]=new char[]{'A','S','O','R','T','I','N','G','E','X','A','M','P','L','E'};

和索引数组:

int  a[]=new int[]{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14};

void insitu (char data[], int a[], N)
{
    for (int i=0;i<N;i++)
    {
        char v=data[i];
        int j, int k;
        for (k = i; a[k] != i; k = a[j], a[j]=j)
        {
            j=k;
            data[k]=data[a[k];
        }
        data[k]=v;
        a[k]=k;
    }
}

我的问题是应该将j初始化为什么。当我运行此代码时,它会要求我初始化j;我该怎么办?

1 个答案:

答案 0 :(得分:2)

这是Sedgewick的C ++算法中的就地排序的Java实现(see page):

public class InSitu {
    public static void main(String[] args) {
        int[] a = { 0, 10, 8, 14, 7, 5, 13, 11, 6, 2, 12, 3, 1, 4, 9 };
        char[] data = { 'A', 'S', 'O', 'R', 'T', 'I', 'N', 'G',
            'E', 'X', 'A', 'M', 'P', 'L', 'E' };
        insitu(data, a, a.length);
        System.out.println(java.util.Arrays.toString(a));
        // prints "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]"
        System.out.println(java.util.Arrays.toString(data));
        // prints "[A, A, E, E, G, I, L, M, N, O, P, R, S, T, X]"
    }
    static void insitu(char[] data,int[] a, int N) {
        for (int i = 0; i < N; i++) {
            char v = data[i];
            int j, k;
            for (k=i; a[k] != i; k = a[j], a[j] = j) {
                j = k;
                data[k] = data[a[k]];
            }
            data[k] = v;
            a[k] = k;
        }
    }
}

关于数组声明

请,请不要养成这样声明数组的习惯:

int x[];

您应该使用类型而不是标识符放置括号:

int[] x;

相关问题


明确分配

编译器非常聪明,可以知道何时明确分配了局部变量,并考虑了循环结构等。

以下代码编译:

        int local;
        do {
            local = 0;
        } while (local != 0);

虽然这不是:

        int local;
        while (local != 0) { // doesn't compile!
            local = 0;
        }

同样,这会编译:

        for (int local; ; local++) {
            local = 0;
        }

这是因为for循环的语义,其中循环体(local = 0;)在控制流中的循环更新(local++)之前,即使它看起来不像喜欢它在文中。

规范不允许编译器智能;例如,以下内容无法编译:

    boolean b = false; // or whatever
    int local;
    if (b) {
        local = 0;
    }
    if (!b) {
        local = 1;
    }
    local++; // doesn't compile! 

但这样做:

    boolean b = false; // or whatever
    int local;
    if (b) {
        local = 0;
    } else {
        local = 1;
    }
    local++;

另见