例如,我们有以下数组:
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
;我该怎么办?
答案 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;
Object[] x
and Object x[]
? int[] myArray
and int myArray[]
in Java int[] k,i
and int k[],i
i
!编译器非常聪明,可以知道何时明确分配了局部变量,并考虑了循环结构等。
以下代码编译:
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++;