2015-11-08 63 views
-1

我正在使用快速排序編寫代碼,但看不到它能夠正常工作。我該如何修復我的代碼?用隨機數快速排序填充

我已經聲明我的數組大小爲20,並填充隨機整數。然後我打電話給我的sort方法做快速排序。 show方法只是打印輸出。仍然我的代碼根本不起作用。

我給快速排序整個代碼:在線程 「主」 java.lang.ArrayIndexOutOfBoundsException

public class JavaApplication3 { 
    public static void main(String[] args) { 
     QuickSort B = new QuickSort(); 

     int[] snum = new int [20]; 
     for(int index = 0; index < snum.length; index++){ 
      snum[index]= (int) (Math.random()); 
     } 

     B.sort(snum); 
     B.show(snum);  
    } 
} 

class QuickSort{ 
    public static void sort(int [] a){ 
     quicksort(a, 0, a.length -1); 
    } 

    private static void quicksort(int[] a, int lo, int hi){ 
     if(hi <= lo) return; 
     int j = partition(a, lo, hi); 
     quicksort(a, lo, j-1); 
     quicksort(a, j+1, hi); 
    } 

    private static void exch(int [] a, int i, int j){ 
     int t = a[i]; 
     a[i] = a[j]; 
     a[j] = t; 
    } 

    private static int partition(int[] a, int lo, int hi){ 
     int i= lo; 
     int j = hi+1; 
     int pivot = a[lo]; 
     while(i<=j){ 
      while(a[i] < pivot){ 
       i++; 
      } 
      while(a[j] > pivot){ 
       j--; 
      } 
      if(i <= j){ 
       exch(a, i, j); 
       i++; 
       j--; 
      } 
     } 
     if (lo < j) 
      quicksort(a, lo, j); 
     if (i < hi) 
      exch(a, i, j); 

     return j; 
    } 

    public static void show(int[]a){ 
     for(int i=0; i<a.length;i++) 
      System.out.print(a[i] + " "); 
     System.out.println(); 
    } 

例外: 20在javaapplication3.QuickSort.partition(JavaApplication3.java:61) 在javaapplication3.QuickSort.quicksort(JavaApplication3.java:43)在 javaapplication3.QuickSort.sort(JavaApplication3.java:39)在 javaapplication3.JavaApplication3.main(JavaApplication3.java:29)的Java 結果:1

+1

什麼不工作,爲什麼你使用靜態方法? –

+0

@Aツ我得到IndexOutofBound,但我已經聲明瞭我的數組的大小。或者我錯了? –

+0

請寄出_actual error_ ---整個回溯。整個工作就是告訴你哪裏出了問題,在哪裏。 –

回答

0

一個問題是,產生的Math.random小數小於1,當你將它轉換成int,這些數字導致0,所以由10

+0

我做了,不知何故,它不在那裏。不過,我遇到了同樣的邏輯錯誤。 –

+0

我向你展示了我的實現Hoare的分區。 –

+0

你可以在你的第一個答案中加入你的霍爾分區。我看不到它。 –

0

希望這有助於繁殖的Math.random。

int hoaresPartition(int *arr, int lo, int hi){ 
    int pivot = arr[lo]; 
    int i = lo - 1; 
    int j = hi + 1; 
    while (true){ 

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

     do { 
      i = i+1; 
     }while (arr[i] < pivot); 

     if (i < j){ 
      int temp; 
      temp = arr[i]; 
      arr[i] = arr[j]; 
      arr[j] = temp; 
     }else 
      return j; 
    } 
} 
+0

即使它返回正確的結果,代碼塊也不是很多答案。在這種情況下,它比平時沒有什麼幫助,因爲你提供了一個全新的方法,而不需要指出它應該替換什麼或應該如何使用,更不用說它是如何解決問題的。幾行文字可以使一個有用的答案和一個難題之間的(巨大的)區別。 –