2012-05-31 121 views
2

現在我在高中12年級學習Java編程課程。現在我明天有一個考試,我正在努力學習。該測試是一個實際測試,我必須採用基本數據或對象,並使用插入排序,選擇排序和合並排序將它們排序爲原始數據,數組或數組列表。現在我把它放在原始數據上。只是我在將對象排序到數組和列表中非常困難。我有選擇排序數組和數組列表,所以它只是合併排序和插入排序我有親愛的麻煩。我只是不知道該怎麼做。使用插入排序,選擇排序和合並排序

非常感謝您的幫助。

爲了簡化問題,我想知道如何在這兩個類轉換爲名爲Circle

我的代碼第一塊送過來隨機界對象進行排序,然後將其送入我的其他類進行排序。我的最後一個代碼塊對它進行排序。

package Merge_Sort_Objects_Array; 
import java.util.Scanner; 
import java.lang.Math; 

public class TestSorts { 
    public static void displayArray(int[] array){ 
     for (int i = 0; i < array.length; i++){ 
      System.out.print(array[i] + " "); 
     } 
      System.out.println("\n"); 
     } 

     public static void main(String[] args) { 
     Scanner input = new Scanner(System.in); 
     int numItems; 
     int[] test; 

     System.out.print("Enter number of elements: "); 
     numItems = input.nextInt(); 

     /* populate array with random integers */ 
     test = new int[numItems]; 
     for (int i=0; i < test.length; i++){ 
      test[i] = (int)(100 * Math.random()); 
     } 
     System.out.println("Unsorted:"); 
     displayArray(test); 

     mergesort.mergesort(test, 0, test.length - 1); 

     System.out.println("Sorted: "); 
     displayArray(test); 
    } 

} 





    package Merge_Sort_Objects_Array; 

    public class mergesort { 

    /** 
    * Merges two sorted portion of items array 
    * pre: items[start.mid] is sorted. items[mid+1.end] sorted. start <= mid <= end 
    * post: items[start.end] is sorted 
    */ 

    private static void merge(int[] items, int start, int mid, int end){ 
      int[] temp = new int[items.length]; 
      int pos1 = start; 
      int pos2 = mid + 1; 
      int spot = start; 

      while (!(pos1 > mid && pos2 > end)){ 
       if ((pos1 > mid) || ((pos2 <= end) &&(items[pos2] < items[pos1]))){ 
        temp[spot] = items[pos2]; 
        pos2 +=1; 
       }else{ 
        temp[spot] = items[pos1]; 
        pos1 += 1; 
       } 
       spot += 1; 
      } 
      /* copy values from temp back to items */ 

      for (int i = start; i <= end; i++){ 
       items[i] = temp[i]; 
      } 
    } 

    /** 
    * mergesort items[start..end] 
    * pre: start > 0, end > 0 
    * post: items[start..end] is sorted low to high 
    */ 
    public static void mergesort(int[] items, int start, int end){ 
     if (start < end){ 
      int mid = (start + end)/2; 
      mergesort(items, start, mid); 
      mergesort(items, mid + 1, end); 
      merge(items, start, mid, end); 
     } 
    } 
} 

更好嗎?

好的格雷格,這裏是更新的testSorts類。現在我將它們全部更改爲Circle而不是int,但是我仍然在之前發現的那個錯誤中找到了該錯誤。

public class TestSorts { 
    public static void displayArray(Circle[] array){ 
     for (int i = 0; i < array.length; i++){ 
      System.out.print(array[i] + " "); 
     } 
      System.out.println("\n"); 
     } 

     public static void main(String[] args) { 
     Scanner input = new Scanner(System.in); 
     int numItems; 
     Circle[] test; 

     System.out.print("Enter number of objects: "); 
     numItems = input.nextInt(); 

     /* populate array with random integers */ 
     test = new Circle[numItems]; 
     for (int i=0; i < test.length; i++){ 
      test[i] = new Circle((int)(10 * Math.random() + 1)); 
     } 
     System.out.println("Unsorted:"); 
     displayArray(test); 

     mergesort.mergesort(test, 0, test.length - 1); 

     System.out.println("Sorted: "); 
     displayArray(test); 
    } 

} 

這有幫助嗎?

+1

你的問題是什麼?您能否顯示一些您遇到問題的代碼? –

回答

1

看起來您需要做兩件基本的事情來修改現有的排序代碼來處理Circle對象。

  1. 更改類型int在您的排序方法數組類型(僅僅是數組類型,而不是索引)鍵入Circle

  2. 做一些有意義的事情來代替items[pos2] < items[pos1](因爲你不能比較對象與<)。也許對於要按半徑排序的圈子,可以使用items[pos2].getRadius() < items[pos1].getRadius()。但這取決於你。

當你瞭解generic programming,你會發現更好的方法來做到這一點,使現有的代碼可以應用到任何合適類型的對象,而不必每次你需要使用它的時間來修改它一種新型。

+0

謝謝格雷格,你讓我有90%的路,謝謝。我從來沒有想過.getRadius()的想法,這個建議真的有幫助。另一個卡住的地方是在testSorts底部附近的這條線「mergesort.mergesort(test,0,test.length - 1);」現在,第一個測試給我一個錯誤,說它需要一個int。你是否知道解決這個問題? – Spartan

+0

@Spartan:您還需要修改'TestSorts'中的代碼來創建一個'Circle'對象而不是'int'的數組。 –

+0

是的,我這樣做,但它仍然給我的錯誤。我將更新頂部的代碼以顯示我擁有的內容。但是這就是爲什麼它讓我感到困惑,我做了所有這些,但是我仍然有這樣的錯誤。 – Spartan