2013-09-20 3 views
1

Каков алгоритм выбора сортировки для двумерного массива? Я смотрел и читал о 2D-массивах везде, но я не могу найти ничего простого и прямого, поэтому я прибегал к обсуждению на форуме. (Я не могу показаться, чтобы обернуть мой взгляд вокруг, как изменить вид 1D-массива, чтобы сделать это 2D массив !!)Сортировка сортировки 2D-массив

Например, это:

name ----- crime ----- year 

name1 ---- arson ----- 1996 
name2 ---- theft ----- 2003 
name3 ---- arson ----- 1976 
name4 ---- theft ----- 2010 

Становится это:

name ----- crime ----- year 

name1 ---- arson ----- 1996 
name3 ---- arson ----- 1976 
name2 ---- theft ----- 2003 
name4 ---- theft ----- 2010 

Любая помощь будет замечательной! Благодаря!

EDIT

Вот код, у меня есть для выбора вида. Большинство из них организованы правильно, но в нескольких строках у меня есть «поджог», где он не принадлежит, и я не уверен, почему это так. Вот мой код:

for(i = 0; i < 10; i++){ 
     smallest = i; 
     for(j = i; j < 10; j++){ 
      if(criminals[i][1].compareTo(criminals[j][1]) > 0){ 
       smallest = j; 
      } 
     } 
     temp = criminals[i][1]; 
     criminals[i][1] = criminals[smallest][1]; 
     criminals[smallest][1] = temp; 
    } 

    //output 
    for(i = 0; i < 10; i++){ 
     System.out.println(criminals[i][0] + " - " + criminals[i][1] + " - " + criminals [i][2]); 
    } 

И это мой вход и выход:

Not sorted list: 
Al Capone - arson - 2009 
Slippery Sal - theft - 2001 
Nada - arson - 1987 
Slippery Sal - theft - 1999 
Salma - assault - 2010 
Scooby Doo - theft - 1998 
Velma - assault - 1991 
Daphne - arson - 1976 
Fred - assault - 2003 
Shaggy - arson - 2007 
Sorted list (by crime): 
Al Capone - arson - 2009 
Slippery Sal - arson - 2001 
Nada - arson - 1987 
Slippery Sal - assault - 1999 
Salma - arson - 2010 
Scooby Doo - assault - 1998 
Velma - assault - 1991 
Daphne - theft - 1976 
Fred - theft - 2003 
Shaggy - theft - 2007 
+1

Преобразование массива в массив 1D, сортировка и возврат результатов в 2D-массив. – arshajii

+1

Что вы понимаете, сортируя 2D-массив? На многих языках 2D-массив представляет собой всего лишь 1D массив массивов, а массивы часто сравнимы. Или вы думаете, что 2D-массив представляет собой последовательность значений, написанных только в строках? Можете ли вы привести пример? –

+0

@RayToal Это массив массивов. Мне пришлось написать список преступников (10 строк), и для каждого преступника я должен был иметь имя, преступление, год (3 колонки). Я хочу сортировать список по преступлениям, и я должен использовать сортировку, но я хочу, чтобы имя преступника и год оставалось с преступлением. – Sal

ответ

0

Ваш комментарий, указанные общие критерии сортировки заключается в следующем: в каждой строке, элементы должны быть отсортированы.

Запустите алгоритм Selection sort для каждого массива 1D (из 2D-массива) за раз.

3

Для вашей уголовной вещи, сделать это:

static final int SORT_BY_NAME = 0; 
static final int SORT_BY_CRIME = 1; 
static final int SORT_BY_YEAR = 2; 

Предполагая, что это:

Object[10][3] = {{"Name", "CRIME", "YEAR"},...}; 

Теперь ваш алгоритм сортировки:

void SelSort(Objects[][] criminals, int sortBy) 
{ 
    if (criminals == NULL || criminals.length == 0 || sortBy >= criminals[0].length || sortBy < 0) 
     return; 

    int i,j; 
    Object min; 

    for (i=0; i < criminals.length ; i++) { 
     min = criminals[i][sortBy]; 
     for (j = i+1; j < criminals.length; j++){ 
      if (((criminals[j][sortBy].getClass()).cast(min)).compareTo(criminals[j][sortBy]) == 1){//Assuming you can compare them this way else make a method to compare 
       Object tmp = criminals[j]; 
       criminals[j] = criminals[i]; 
       criminals[i] = tmp; 
      } 
     } 
    }    

} 
+0

Это было полезно! Что такое k и l, точно? – Sal

+0

К сожалению, это неправильная интерпретация вопроса OP. @RayToal имеет righ Идея. – Zong

+0

Что я делал, проходил каждый элемент матрицы, k и l, где индексы пересекали всю матрицу (2D-массив), чтобы найти минимум. То, что я делал, малыми словами, - это думать о матрице (2D-массив) как о 1 большом массиве 1D и пересекать его. Как и матрица 2x10 имеет следующие элементы: [a00 a01 a02 ... a09 -> a10 a11 a 12 .... a19] Теперь k и l позволят мне для каждого из этих элементов (скажем, я держал текущую позицию в матрице с i и j, чтобы пересечь оставшиеся элементы, чтобы найти минимум и заменить его. – Sinn

1

Ну, прежде всего, чтобы быть придирчивыми , похоже, у вас есть массив из Criminal объектов, что-то вроде

class Criminal { 
    private String name; 
    private String crime; 
    private int year; 
    . 
    . 
    . 
} 

Тогда у вас будет 1D массив преступных объектов. Вы можете использовать обычный алгоритм выбора сортировки, но вместо сравнения

criminals[i] < criminals[j] 

вы бы сравнить

criminals[i].getCrime() < criminals[j].getCrime() 

Теперь, давайте не требователен и предположим, что у вас действительно есть 2-D массив строк в , поэтому каждая строка массива сама является массивом строк. Тогда просто выбор рода, но сравнивать, как это:

criminals[i][1] < criminals[j][1] 

Это работает, потому что

criminals[row][0] is the name 
criminals[row][1] is the crime 
criminals[row][2] is the year 

Когда вы делаете своп, целые строки будут заменены, и вы будете иметь то, что вы хотите.

+0

Это уже обсуждалось в комментариях. OP выполняет назначение школы на '2D' массивах –

+0

Правда, но, как школьное задание, я думаю, что OP застрял в использовании двумерных массивов, для которых «[1]» может помочь. Если кто-то еще перехватывает и находит этот ответ без значения, кроме того, чтосказал в комментариях, я с радостью удалю его. –

+0

Я использовал это, и это сработало! За исключением одного. Один из выходов выключен. Большинство из них организованы отлично, но затем у меня есть случайный «поджог» посреди кучки «нападений», перечисленных преступлений. Я отправлю свой код. – Sal

0

Следовательно, ваш 2D-массив - String[][] array.Затем выполните инициализацию массива и выполните следующие действия:

for (int i = 0; i < array.length; i++) 
{ 
    int index = i; 
    for (int j = i + 1; j < array.length; j++) 
    { 
     if (array[j][sortByColIndex].compareTo(array[index][sortByColIndex]) < 0) 
     { 
      index = j; 
     } 
    } 
    String smallerNumber = scores[index][sortByColIndex]; 
    scores[index][sortByColIndex] = scores[i][sortByColIndex]; 
    scores[i][sortByColIndex] = smallerNumber; 

    // Displaying sorted value 
    System.out.print(array[i][0] + "\t" + array[i][1] + "\t" + array[i][2] + "\t"); 

} 
Смежные вопросы