Это Java-реализация сортировки на месте в алгоритмах Седжвика в C ++ ( см. Стр. ):
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++;
Смотри также