2014-01-19 4 views
0

Вот код .. Мне нужно отсортировать уже отсортированный массив и рассчитать время его выполнения ... для quicksort это n^2, потому что это худший случай. но для больших входных данных, скажем, 7500, это дает мне ошибку переполнения: S, что я могу сделать, чтобы вычислить время работы?Почему возникает ошибка переполнения стека?

public class Provo { 

    public static void swap(int[] a, int i, int j) { 
     int temp = a[i]; 
     a[i] = a[j]; 
     a[j] = temp; 
    } 

    public static int HoarePartition(int m, int d, int[] a) { 
     int pivot = a[m]; 
     int i = m + 1; 
     int j = d; 

     while (i < j) { 
      while (a[i] < pivot) { 
       i = i + 1; 
      } 

      while (a[j] > pivot) { 
       j = j - 1; 
      } 

      if (i < j) 
       swap(a, i, j); 
     } 
     swap(a, m, j); 

     return j; 
    } 

    public static void quicksort(int m, int d, int[] a) { 
     if (m < d) { 
      int s = HoarePartition(m, d, a); 
      quicksort(m, s - 1, a); 
      quicksort(s + 1, d, a); 
     } 
    } 
} 

и здесь является основным классом

import javax.swing.*; 

public class ascending { 


public static void main(String[] args){ 
    String input=JOptionPane.showInputDialog("Shkruani nr e te dhenave"); 
    int size=new Integer(input).intValue(); 

    int[] r= new int[size]; 
    int[] p = new int[size]; 
    int majtas=0; 
    int djathtas=size; 

    for(int i=majtas;i<djathtas;i++) 
    {r[i]=i;} 
    for(int i=majtas;i<djathtas;i++) 
    {p[i]=r[i];} 

    long average; 
    int n=100; 
    long result=0; 
    for(int j=1;j<=n;j++) 
    { 
     long startTime = System.nanoTime(); 
     Provo.quicksort(majtas,djathtas-1,p); 
    long endTime = System.nanoTime(); 
    result = result+(endTime-startTime); 
    long a = endTime-startTime; 
     System.out.println(j+": " +a); 
     for(int i=majtas;i<djathtas;i++) 
     {p[i]=r[i];} 
    } 
    average=result/n; 
    System.out.println("Koha e ekzekutimit te insertion sort eshte " + average + " nanosekonda "); 
} 

}

+1

Используйте нерекурсивный быстрый сортировку. Рекурсия не сработает в какой-то момент –

+0

как я могу это сделать? : S Я работал над этим весь день, и я не могу этого сделать. Крайний срок - завтра :( – user3212703

+0

Научитесь отлаживать свой код. –

ответ

0

Изменение int djathtas = size - 1; в int djathtas = size; и change quicksort(majtas, djathtas, p); к quicksort(majtas, djathtas - 1, p);

В противном случае это не выделение 10 цифр, только 9.

Похоже, вы просто используете слишком большой номер. Ваша программа может работать правильно и генерировать ошибку переполнения стека. Вы можете попробовать реализовать другую версию quicksort, которая не полагается на стек или что-то в этом роде.

Кроме этого, я не уверен, зачем вам нужен такой большой вход.

+0

это не ?? но почему это дает мне переполнение стека, когда n = 7500 или более? : S :( – user3212703

+0

Я запускаю код на netbeans прямо сейчас, и я скопировал все это слово в слово в слово. Я только изменил две вещи, которые я упомянул в своем ответе, а затем нажал кнопку «Бег». Он отлично работает без переполнения стека Вы точно изменили все правильно? Не могли бы вы повторно загрузить свой код? Поцарапайте это, я получаю ошибку stackoverflow на 15 000 входов. – Matthew

+0

хорошо, я отредактировал то, что вы сказали мне, но только в основном классе ... i re-uploaded там код: // – user3212703

1

Ну, если вы застряли, вы можете, возможно, Ищут итерационного сортировки в Интернете, чтобы получить некоторую помощь.

Я нашел это article. Он посвящен C#, но перевод его на Java не должен быть большой проблемой.

+2

Глубина рекурсии qsort-шкал с логарифмом входного размера. Это не проблема OP. –

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