2015-03-22 6 views
0

Мне нужна помощь. Я реализовал QuickSort в Java, и теперь я тестирую необходимое время для работы с 50.000 до 15.000.000 элементов. Проблема в том, что это так долго. Например:QuickSort в Java, для большого количества элементов

50.000 Elements, 38 seconds. 
100.000 Elements, 230 seconds. 
250.000 Elements, I'm still waiting (around 8 minutes) 

Это нормально? Вот мой код:

/* Clase que implementa el QuickSort */ 
public class QuickSort { 
    private static final int corte = 3; 
    private int i, j; 

    public void ordenar(Comparable[] a, int izquierda, int derecha) { 

     if (izquierda + corte <= derecha) { 

      Comparable pivote = mediana(a, izquierda, derecha); 

      i = izquierda; 
      j = derecha - 1; 

      for (;;) { 
       while (a[++i].compareTo(pivote) < 0) { 
       } 
       while (a[--j].compareTo(pivote) > 0) { 
       } 
       if (i < j) { 
        intercambiar(a, i, j); 
       } else { 
        break; 
       } 

       intercambiar(a, i, derecha - 1); 
      } 

      ordenar(a, izquierda, i - 1); 
      ordenar(a, i + 1, derecha); 

     } else { 

      InsertSort(a); 
     } 
    } 

    private static Comparable mediana(Comparable[] a, int izquierda, int derecha) { 
     int centro = (izquierda + derecha)/2; 

     if (a[centro].compareTo(a[izquierda]) < 0) { 
      intercambiar(a, izquierda, centro); 
     } 

     if (a[derecha].compareTo(a[izquierda]) < 0) { 
      intercambiar(a, izquierda, derecha); 
     } 

     if (a[derecha].compareTo(a[centro]) < 0) { 
      intercambiar(a, centro, derecha); 
     } 

     intercambiar(a, centro, derecha - 1); 
     return a[derecha - 1]; 

    } 

    private static void intercambiar(Comparable[] arreglo, int a, int b) { 
     Comparable temporal; 
     temporal = arreglo[a]; 
     arreglo[a] = arreglo[b]; 
     arreglo[b] = temporal; 

    } 

    private void InsertSort(Comparable[] lista) { 

     for (int i = 1; i < lista.length; i++) { 
      Comparable auxiliar = lista[i]; 
      int j = i - 1; 

      while (j >= 0 && lista[j].compareTo(auxiliar) > 0) { 

       lista[j + 1] = lista[j]; 
       j = j - 1; 

      } 

      lista[j + 1] = auxiliar; 

     } 
    } 
} 



public class Test { 

    public static void main (String [] args) { 
     long tInicial = 0; 
     long tFinal = 0; 
     long tRes = 0; 
     int tam = 250000; 

     Arreglo B = new Arreglo (tam); 

     System.out.print("Prueba de Tiempo:"); 
     B.cargarArreglo(); 
     tInicial = System.currentTimeMillis(); 
     B.ordenarArreglo(); 
     tFinal = System.currentTimeMillis(); 

     tRes = tFinal - tInicial; 
     System.out.println(); 
     System.out.println("Tiempo Transcurrido (ms): " + tRes + " para " + tam + " elementos."); 
    } 
} 
+0

Не 'InsertSort (a);' сортировать весь массив? Почему вы хотите отсортировать весь массив в качестве базового аргумента для рекурсии quicksort? – fabian

+0

Greaaat! Это была моя ошибка! Спасибо! МНОГО! Теперь, 250.000 элементов занимает 328 мс, чтобы закончить. Спасибо дружище :) –

ответ

0

Время выполнения быстрой сортировки составляет (в среднем) O (п войти п) или (наихудший) O (N^2). Это означает, что время работы для 50.000 составляет 50.000 * 10.819778284410283 ~ 540000. Для 250.000 время выполнения: 250.000 * 12.429216196844383 ~ 3.100.000. Из-за этого время выполнения для 250 000 будет ~ 6x времени выполнения 50.000. Другим фактором будет управление памятью. Фактор от 50.000 до 250.000 элементов на самом деле составляет: ~ 12.63. Это все еще нормально, учитывая наихудший случай O (n^2).

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