2016-02-03 2 views
0

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

private static void InsertionSort(int[] a, int n) { 

    int key, j; 
    for (int i = 1; i < n; i++){ 
      key = a[i]; 
      j = i - 1; 
      while ((j >= 0) && (a[j] > key)){ 
       a[j+1] = a[j]; 
       j = j - 1; 
      } 
      a[j+1] = key; 
    } 
} 

Для 2D-массива я задаю целое число c для столбца, с помощью которого можно отсортировать массив. Например, если я отсортировать по первому столбцу,

{4, 1, 3}, 
{6, 0, 2}, 
{5, 9, 8} 

становится

{4, 1, 3}, 
{5, 9, 8}, 
{6, 0, 2} 

Это то, что я до сих пор для сортировки 2D массив с помощью указанного столбца

private static void InsertionSort(int[][] a, int n, int c) { 

    in key, j; 
    for (int i = 1; i < n; i++){ 
     key = a[i][c]; 
     j = i - 1; 
     while ((j >= 0) && (a[j][c] > key)){ 
      a[j+1][c] = a[j][c]; 
      j = j - 1; 
     } 
     a[j+1][c] = key; 
    } 
} 

но результат для сортировки по первой колонке составляет

{4, 1, 3} 
{5, 0, 2} 
{6, 9, 8} 

Сортирует элементы первого столбца, не сохраняя их вместе со своими строками. Как я могу это решить?

ответ

0

Вам нужно поменять строку данных, а не только элемент данных.

private static void sort(int[][] a, int n, int c) { 
    int key, j; 
    for (int i = 1; i < n; i++){ 
     key = a[i][c]; 
     int[] keyRow = a[i]; 
     j = i - 1; 
     while ((j >= 0) && (a[j][c] > key)){ 
      //a[j+1][c] = a[j][c]; 
      a[j+1] = a[j]; 
      j = j - 1; 
     } 
     //a[j+1][c] = key; 
     a[j+1] = keyRow; 
    } 
} 
0

Из Java 8 вы можете сделать это в одной строке.

Arrays.sort(data, (a, b) -> a[COL] - b[COL]); 

где COL - столбец для сортировки.