2015-12-16 3 views
-2

Моя цель - сортировать матрицу с событиями в соответствии с их датами (хранится в матрице как события [eventIndex] [1]. Как-то я получаю почти правильный вывод, за исключением того, в смелойСортировка массива с датами (Quicksort)

должен ли я сортировать год, месяцы и дни отдельно Или у меня сома логическая ошибка в моей сравнить метод

Перед сортировкой:?
12/24/2015
12/19/2015
12/30/2015
11/13/2015
12/30/2015
01/15/2016
12/31/2015
01/15/2016
12/24/2015
12/19/2015
12/31/2015
01/15/2016

После сортировки:
11/13/2015
12/19/2015
12/19/2015
12/24/2015
12/24/2015
12/30/2015
12/31/2015
12/30/2015
12/31/2015

01/15/2016
01/15/2016
01/15/2016

Вот мой код.

public void quickSort(String[][] event, int low, int high, Compare c) { 
    if (event == null || event.length == 0) 
     return; 

    if (low >= high) 
     return; 
    // pick the pivot 
    int middle = low + (high - low)/2; 

    // make left < pivot and right > pivot 
    int i = low, j = high; 
    while (i <= j) { 
     while (c.compare(i, middle)) { 
      i++; 
     } 
     while (c.compare(middle, j)) { 
      j--; 
     } 
     if (i <= j) { 
      String[] temp = event[i]; 
      event[i] = event[j]; 
      event[j] = temp; 
      i++; 
      j--; 
     } 
    } 
    // recursively sort two sub parts 
    if (low < j) 
     quickSort(event, low, j,c); 

    if (high > i) 
     quickSort(event, i, high,c); 
} 

//Interface for comparing two types 
public interface Compare { 
    boolean compare(int first, int second); 
} 
public class CompareDate implements Compare { 

    @Override 
    public boolean compare(int first, int second) { 
     //Splitting up the date string and converts into int 
     //Splitting first index 
     String[] temp = event[first][1].split("/"); 
     int firstYear = Integer.parseInt(temp[2]); 
     int firstMonth = Integer.parseInt(temp[0]); 
     int firstDay = Integer.parseInt(temp[1]); 

     //Splitting second index 
     temp = event[second][1].split("/"); 
     int secondYear = Integer.parseInt(temp[2]); 
     int secondMonth = Integer.parseInt(temp[0]); 
     int secondDay = Integer.parseInt(temp[1]); 

     //Comparing the values 
     if (firstYear < secondYear) return true; 
     else if (secondYear < firstYear) return false; 
     else if (firstMonth < secondMonth) return true; 
     else if (secondMonth < firstMonth) return false; 
     return (firstDay < secondDay); 
    } 
} 
+0

Вы можете сначала отсортировать годы, затем месяцы, а затем дни. Или даже использовать объекты даты и список и компаратор –

ответ

0

Вот хорошее решение с использованием рекурсии. Он может быть не оптимальным, но он отлично работает.

public static void quickSort(String[] event) { 
    String temp; 
    int a, b, c, d, e, f; 

    // Sorting years 
    for (int i = 0 ; i < event.length - 1 ; i++){ 
     a = Integer.valueOf(event[i].split("/")[2]); 
     b = Integer.valueOf(event[i+1].split("/")[2]); 
     // Sorting years 
     if (a > b){ 
      temp = event[i]; 
      event[i] = event[i+1]; 
      event[i+1] = temp; 
      quickSort(event); 
     } else if (a == b){ 
      c = Integer.valueOf(event[i].split("/")[0]); 
      d = Integer.valueOf(event[i+1].split("/")[0]); 
      // Sorting months 
      if (c > d){ 
       temp = event[i]; 
       event[i] = event[i+1]; 
       event[i+1] = temp; 
       quickSort(event); 
      } else if (c == d){ 
       e = Integer.valueOf(event[i].split("/")[1]); 
       f = Integer.valueOf(event[i+1].split("/")[1]); 
       // Sorting days 
       if (e > f){ 
        temp = event[i]; 
        event[i] = event[i+1]; 
        event[i+1] = temp; 
        quickSort(event); 
       } 
      } 
     } 
    } 
}