2013-04-09 49 views
3

在這個程序中,我使用mergeSort排序奧運獎牌。Java - 用字符串合併排序

有些東西似乎與我的代碼有點關閉,因爲有時它會給我一個java.lang.ArrayIndexOutOfBoundsException,有時它不會。


對於一個小的背景說明:

我有一個隨機生成奧運會的國家和他們的獎牌在記分牌贏的方法。返回結果的字符串[]陣列中的形式:

CAN 1 1 1

USA 1 1 2

GBR 0 0 1

CHN 0 0 2


但是,記分牌需要按照黃金,白銀和銅牌的降序進行組織。因此,它必須是這樣的:

美國1 1 2

CAN 111

CHN 0 0 2

GBR 0 0 1

使用bubblesort和quicksort對板進行排序工作正常,但mergesort不會n OT。有時它會很好,但更多的時候它會給我ArrayIndexOutOfBoundsException。

public static void main(String[] args) {  

    Olympic_Results score = new Olympic_Results(); 

    //print a return value of an array  

    String[] countries = score.OlympicResult(7); //input how many game results 
    mergeSort(countries, 0, countries.length - 1); 
    for (String value:countries) 
    System.out.println(value); 
} 

public static void mergeSort(String array[], int lo, int n) { 
    int low = lo; 
    int high = n; 
    if (low >= high) { 
    return; 
    } 

    int middle = (low + high)/2; 
    mergeSort(array, low, middle); 
    mergeSort(array, middle + 1, high); 
    int end_low = middle; 
    int start_high = middle + 1; 
    while ((lo <= end_low) && (start_high <= high)) { 
    if ((array[low].substring(4,8)).compareTo(array[high].substring(4,8)) > 0) { 
     low++; 
    } 

    else { 
     String Temp = array[start_high]; 
     for (int k = start_high - 1; k >= low; k--) { 
     array[k + 1] = array[k]; 
     } 
     array[low] = Temp; 
     low++; 
     end_low++; 
     start_high++; 
    } 
    } 
} 

任何想法,爲什麼這個代碼不能正常工作?謝謝!

+0

什麼線做的堆棧跟蹤點嗎? – CodeChimp 2013-04-09 11:25:11

+0

一些方面的評論:Java中的方法和變量通常是'camelCase'。類通常是沒有下劃線的「TitleCase」。 – 2013-04-09 12:11:36

+0

你爲什麼重新發明輪子?你爲什麼要合併排序?它是不是最重要的東西,它是排序?我會使用Array.sort()。 – Bohemian 2013-04-09 12:14:14

回答

0

我想你去太深劃分數組部分:

if (low >= high) { 
    return; 
    } 

嘗試啓動停在這兒固定它,當長度爲1

if (high - low <=1) { 
    return; 
    } 

順便說一句,如果長度是2,那麼你可以比較這些值並立即返回已經排序的值。

UPD

你似乎具有類似名稱添加了太多的變量和他們失去了自己:) ..

這看起來不正確:

,而((LO < = end_low)& &(start_high < =高)){

+0

@ n00b它對您有幫助嗎? – Vitaly 2013-04-17 19:14:21

0

兩個主要錯誤:

  1. 你保留兩個具有相似名稱但目的不同的變量。結果while循環測試lo值,儘管從不改變它(該循環與low變量一起工作)。

  2. if裏面while應比較兩個排序系列的初始項目來選擇其中之一。你扳成lowstart_high開始,所以你應該比較array[low]array[start_high],但你把它比作array[high]代替。如果array[high]數據恰好是最小的子區間進行排序,那麼low價值將得到增加超過數組大小(和while條件不抓住它,因爲它測試lo代替)。