Bubble-Sort с 2D массивом - PullRequest
       18

Bubble-Sort с 2D массивом

2 голосов
/ 06 декабря 2009

Привет, я знаю, как реализовать простую пузырьковую сортировку для одномерного массива. Но с 2-мерными или многомерными вот где у меня проблемы.

До сих пор я использовал это для сортировки 1-мерных массивов, работает как шарм. Но в основном с целыми числами, а не со строками:

boolean sort;

do{
    sort = true;

    for (int i = 0; i < testarray.length - 1; i++){
        if(testarray[i] > testarray[i+1]){
            temp = testarray[i];
            testarray[i] = testarray[i+1];
            testarray[i+1] = temp;           
            sort = false;
        }
    }

}while(!sort);

    // Descending Output
    // for (int k = testarray.length - 1; k >= 0 ; k--){

    // Ascending Output
    for (int k = 0; k < testarray.length ; k++){
        System.out.print(testarray[k] + ", ");
    }

Предположим, у меня есть:

Номер клиента, Имя, Фамилия, Адрес

String customers[][] = {{"123", "John", "Doe", "Somewhere"}, {"007", "James", "Bond", "MI5"}, {"1337", "Lolcat", "Izgud", "Saturn"}}

Теперь я хочу выбрать сортировку после сортировки: номер клиента, имя, фамилия или адрес. И после этого я хочу вывести его по возрастанию или убыванию, в зависимости от того, что я хочу.

Я просто не знаю, как реализовать это с помощью пузырьковой сортировки. Я хочу остаться в пузырьковой сортировке, другого алгоритма сортировки нет, я хочу узнать, как работает пузырьковая сортировка в такой ситуации.

Для восходящих и нисходящих моя идея была бы: я мог бы сделать цикл if. Например if (asc == 1) then output ascending, else output descending. Например, asc будет запрашиваться через консоль.

Любая помощь очень ценится.

Ответы [ 4 ]

3 голосов
/ 06 декабря 2009

2-мерный массив - это в основном 1-мерный массив, состоящий из массивов.

Просто используйте тот же код, который у вас есть, только вместо целочисленных, переместите внутренние массивы.

Чтобы узнать, является ли один массив «большим», чем следующий, сравните строковые значения правильного члена массива (таким образом, имя или фамилия, ..). Для этого вы можете использовать метод String CompareTo.

Последнее примечание: приведенный вами пример лучше, если внутренний массив на самом деле является объектом, содержащим информацию. Таким образом, вы можете иметь отдельные типы данных для всех полей вместо того, чтобы делать их строковыми.

например:.

  class Person
  {
       int customerNumber;
       String name;
       String surName;
       String address;
  };

РЕДАКТИРОВАТЬ: фактически ответить на ваш вопрос:

измените вашу программу следующим образом:

изменить временное объявление:

 String [] temp;

и измените строку:

 if(testarray[i] > testarray[i+1])

в

 if(testarray[i][1] > testarray[i+1][1])

чем будет работать и сортировать по названию

R

3 голосов
/ 06 декабря 2009

В 2D-массиве тип содержащихся объектов изменяется с int или Integer на String[] (примечание: это массив строк). Это то, что вам нужно, чтобы изменить тип temp на.

Самое большое изменение будет в вашем сравнении. Вы не можете просто сравнить два массива String, используя < & ndash; но ты уже знал это. Что вам нужно сделать, так это создать себе метод, который принимает два String[] аргумента и возвращает отрицательное, 0 или положительное число в зависимости от того, меньше ли первое / равно / больше второго. Затем вы можете сделать сравнение < / > результата этого метода, чтобы установить порядок сортировки.

Если вы хотите использовать несколько различных критериев сортировки, вам нужно либо сделать функцию сравнения более универсальной, например, передав другой параметр, чтобы сообщить ему, как работать, либо вам потребуется несколько различных функции сравнения и используйте if или switch, чтобы решить, какой из них использовать во время сортировки.

Что касается ручного сравнения двух массивов String, основной метод таков: Сравните первые строки ключей, используя String.compareTo(). Если результат не равен 0, верните его. Если это 0, то первые ключи равны, и вам нужно сравнить следующие ключи. Если у вас закончились ключи и все еще на 0, ваши два элемента равны по своим ключам, и вы возвращаете 0.

2 голосов
/ 06 декабря 2009

Я предполагаю, что вы хотите, чтобы "123", "Джон", "Доу" и "где-то" были сгруппированы вместе.

Я предлагаю вам использовать объект, скажем

public object Person {
    private int id;
    private String name;
    private String surname;
    private String address;
}

добавление обычных геттеров и сеттеров.

вы можете иметь обычный массив объектов Person, сортируя их с помощью алгоритма пузырьковой сортировки. Вы можете создать несколько пользовательских компараторов, которые будут сравнивать ваш идентификатор, имя, фамилию или адрес с пузырьковой сортировкой.

Подпись метода сортировки должна выглядеть примерно так:

public Person[] bubbleSort(Person[] persons, Comparator comp)
2 голосов
/ 06 декабря 2009

Вы можете сохранить тот же алгоритм сортировки. Он все еще не знает о 2D-массиве. Вы должны придумать функцию сравнения, которая берет два одномерных массива и говорит, какой из них больше.

...