Ниже приведен весь исходный код программы из файла Bubble. j ava. /* Пример для опробования 5.1. Демонстрация алгоритма пузырьковой сортировки. */ class Bubble { public static void main(String args[]) { int nums[] = { 99, -10, 100123, 18, -978, 5623, 463, -9,, 287, 49 }; int a, b, t; int size; size = 10; // Количество элементов для сортировки // отобразить исходный массив System.out.print("Original array is:"); for(int i=0; i < size; i++) System.out.print(" " + nums[i]); System.out.println(); // реализовать алгоритм пузырьковой сортировки for(a=l; а < size; а++) for(b=size-l; b >= a; b—) { if(nums[b-l] > nums[b]) { // если требуемый порядок // следования не соблюдается, поменять элементы местами t = nums[b-l]; nums[b-l] = nums[b]; nums[b] = t; } } // отобразить отсортированный массив System, out .print ("Sorted array is: "); for(int i=0; i < size; i++) System.out.print(" " + nums[i]); System.out.println(); } }
Ниже приведен результат выполнения данной программы. Original array is: 99 -10 100123 18 -978 5623 463 -9 287 49 Sorted array is: -978 -10 -9' 18 49 99 287 463 5623 100123
Как упоминалось выше, пузырьковая сортировка отлично подходит для обработки мелких массивов, но при большом числе элементов массива она становится неэффективной. Более универсальным является алгоритм быстрой сортировки, но для его эффективной реализации необходимы языковые средства Java, которые рассматриваются далее в этой книге. Многомерные массивы
Несмотря на то что одномерные массивы употребляются чаще всего, в программировании, безусловно, применяются и многомерные (двух-, трехмерные и т.д.) массивы. В Java многомерные массивы представляют собой массивы массивов. Двумерные массивы
Среди многомерных массивов наиболее простыми являются двумерные массивы. Двумерный массив, по существу, представляет собой ряд одномерных массивов. Для того чтобы объявить двумерный целочисленный табличный массив table размерами 10x20, следует написать такое выражение: int tablet][] = new int[10][20];
Обратите особое внимание на объявление этого массива. В отличие от некоторых других языков программирования, где размеры массива разделяются запятыми, в Java они заключаются в отдельные квадратные скобки. Так, для обращения к элементу массива table по индексам 3 и 5 следует указать table [ 3 ] [ 5 ].
В следующем примере двумерный массив заполняется числами от 1 до 12: // Демонстрация двумерного массива, class TwoD { public static void main(String args[]) { int t, i; int table [][] = new int[3][4]; for(t=0; t < 3; ++t) { for(i=0; i < 4; ++i) { table[t][i] = (t*4)+i+l; System.out.print(table[t][i] + " "); } System.out.println() ; } } }
В данном примере элемент table [0] [0] будет содержать значение 1, элемент table [0] [ 1 ] — значение 2, элемент table [0] [2] — значение 3 и так далее, а элемент table [2 ] [ 3 ] — значение 12. Структура данного массива наглядно показана на рис. 5.1.
Выделяя память под многомерный массив, достаточно указать лишь первый (крайний слева) размер. А память под остальные размеры массива можно выделять по отдельности. Например, в приведенном ниже фрагменте кода память выделяется только под первый размер двумерного массива table. А под второй его размер она выделяется вручную. int tablet][] = new int[3][]; table[0] = new int[4]; table[1] = new int[4]; table[2] = new int[4];
Объявляя массив подобным образом, мы не получаем никаких преимуществ, но в некоторых случаях такое объявление оказывается вполне оправданным. Это, в частности, дает возможность установить разную длину массива по каждому индексу. Как упоминалось выше, многомерный массив реализован в виде массива массивов, что позволяет контролировать длину каждого из них. Допустим, требуется написать программу, в процессе работы которой будет сохраняться число пассажиров, перевезенных автобусом-экспрессом в аэропорт. Если автобус-экспресс делает по десять рейсов в будние дни и по два рейса в субботу и воскресенье, то массив riders можно объявить так, как показано в приведенном ниже фрагменте кода. Обратите внимание на то, что длина массива по второму размеру для первых пяти элементов равна 10, а для двух последних элементов — 2. // Указать разную длину по второму размеру массива вручную, class Ragged { public static void main(String args[]) { int riders[][] = new int[7][]; // Для первых пяти элементов длина массива //по второму размеру равна 10. riders[0] = new int[10]; riders[1] = new int[10]; riders[2] = new int[10]; riders[3] = new int[10]; riders[4] = new int[10]; // Для остальных двух элементов длина массива //по второму размеру равна 2. riders[5] = new int[2]; riders[6] = new int[2]; int i, j; // сформировать произвольные данные for(i=0; i < 5; i++) for(j=0; j < 10; j++) riders[i][j] = i + j + 10; for(i=5; i < 7; i++) for(j=0; j < 2; j++) riders[i][j] = i + j + 10; System.out.println("Riders per trip during the week:"); for(i=0; i < 5; i++) { for(j =0; j < 10; j++) System.out.print(riders[i] [j] + " ") ; System.out.println() ; } System.out.println() ; System.out.println("Riders per trip on the weekend:"); for(i=5; i < 7; i++) { for (j=0; j < 2; j++) System.out.print(riders[i][j] + " "); System.out.println(); } } }
Для большинства приложений использовать нерегулярные массивы не рекомендуется, поскольку это затрудняет восприятие кода другими программистами. Но в некоторых случаях такие массивы вполне уместны и могут существенно повысить эффективность программ. Так, если вам требуется создать большой двумерный массив, в котором используются не все элементы, то нерегулярный массив позволит существенно сэкономить память. Трехмерные, четырехмерные и многомерные массивы
В Java допускаются массивы размерностью больше двух. Ниже приведена общая форма объявления многомерного массива. тип имя_массива[] []...[] = new тип[размер_1] [размер_2] . . . [размер_Ы] ;
В качестве примера ниже приведено объявление трехмерного целочисленного массива размерами 4x10x3. int multidim[][][] = new int[4][10][3]; Инициализация многомерных массивов
Многомерный массив можно инициализировать, заключая инициализирующую последовательность для каждого размера массива в отдельные фигурные скобки, как показано ниже. тип имя_массива[] [] = { { val, val, val, ..., val }, { val, val, val, ..., val }, { val, val, val, .. ., val } };
где val обозначает начальное значение, которым инициализируются элементы многомерного массива. Каждый внутренний блок многомерного массива соответствует отдельной строке. В каждой строке первое значение сохраняется в первом элементе подмассива, второе значение — во втором элементе и т.д. Обратите внимание на запятые, разделяющие блоки инициализаторов многомерного массива, а также на точку с запятой после закрывающей фигурной скобки.
В следующем фрагменте кода двумерный массив sqrs инициализируется числами от 1 до 10 и их квадратами: // Инициализация двумерного массива, class Squares { public static void main(String args[]) { // Обратите внимание на то, что у каждой строки свой ряд инициализаторов. int sqrs[][] = { { 1, 1 }, { 2, 4 }, { 3, 9 }, { 4, 16 }, { 5, 25 }, { 6, 36 }, { 7, 49 }, { 8, 64 }, { 9, 81 }, { 10, 100 } }; int i, j; for(i=0; i < 10; i++) { for (j=0; j < 2; j++) System.out.print(sqrs[i][j] + " "); System.out.println(); } } }