2012-05-31 6 views
2

Теперь я в 12 классе в старшей школе, проводя курс программирования на Java. Теперь у меня есть тест завтра, и я пытаюсь учиться. Тест является практическим тестом, и я должен принимать примитивные данные или объект и сортировать их с помощью сортировки сортировки сортировки, сортировки выбора и сортировки слияния в примитивные данные, массив или список массивов. Теперь у меня это происходит на примитивных данных. Просто мне очень сложно сортировать объекты в массивы и списки массивов. У меня есть сортировка сортировки для массивов и списка массивов, так что это просто сортировка слияния и сортировка вставки. Мне очень жаль. Я просто не понимаю, как это сделать.Сортировка с сортировкой вставки, сортировкой сортировки и слиянием Сортировка

Благодарим за помощь.

Чтобы упростить этот вопрос, я хотел бы знать, как преобразовать эти два класса для сортировки объектов по имени Круг

Мой первый кусок кода здесь получает случайные круги, а затем подает его в мой другой класс для сортировки. Мой последний блок кода сортирует его.

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); 
     } 
    } 
} 

Это лучше?

Хорошо, Greg, вот обновленный класс 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

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