2012-05-31 3 views
2

이제 Java로 프로그래밍 과정을 수강중인 고등학교 12 학년입니다. 이제 내일 시험을 치르며 공부하려고합니다. 이 테스트는 실용적인 테스트이며 원시 데이터 또는 객체를 가져 와서 삽입 정렬, 선택 정렬 및 병합 정렬을 사용하여 원시 데이터, 배열 또는 배열 목록으로 정렬해야합니다. 이제 원시 데이터를 강타했습니다. 객체를 배열과 배열 목록으로 정렬하는 데 정말로 힘든 시간을 보내고 있습니다. 배열 및 배열 목록에 대한 선택 정렬이 있으므로 병합 정렬 및 삽입 정렬과 관련된 문제가 있습니다. 나는 그걸하는 법을 모르겠습니다.삽입 정렬, 선택 정렬 및 병합 정렬로 정렬

미리 도움을 주셔서 감사합니다.

내가 원

코드의 나의 첫번째 덩어리가 여기에 임의의 원을 얻는다라는 이름의 개체를 정렬이 두 클래스를 변환하는 방법을 알고 싶습니다, 문제를 단순화하고 정렬 내 다른 클래스로를 공급합니다. 마지막 코드 블록이 그것을 정렬합니다.

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 클래스입니다. 이제는 int 대신 Circle으로 변경했습니다. 그러나 이전에 식별 한 오류가 계속 발생합니다.

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. 변경하여 정렬 방법의 배열 형 (단지 배열 형식이 아닌 인덱스)에 Circle를 입력 할 수있는 입력 int.

  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'의 코드를 수정하여'int' 대신'Circle' 객체의 배열을 생성해야합니다. –

+0

네, 저도 그래 왔지만 여전히 오류가납니다. 내가 가지고있는 것을 표시하기 위해 코드를 맨 위로 업데이트 할 것입니다. 그러나 그것이 내가 혼란스러워하는 이유입니다. 나는 그 모든 것을했지만, 여전히 그 놈의 실수가 있습니다. – Spartan