主类中的呼叫/测试分类方法

时间:2014-12-19 05:04:13

标签: java sorting bluej

作为参考,我正在Java编程BlueJ

我对这门语言比较陌生,我在排序方面遇到了麻烦。

我正在尝试调用/测试主类中的所有5种排序方法。

我想出了如何调用/测试Quicksort:

Sorting.quickSort(friends, 0, friends.length-1);

但其他人工作不正常。特别是这些:

Sorting.mergeSort(friends, 0, friends.length-1);

Sorting.PbubbleSort(friends, 0, friends.length-1);

Sorting.PinsertionSort(friends, 0, friends.length-1);

Sorting.selectionSort(friends, 0, friends.length-1);

希望有人可以帮助我。

作为参考,这是未排序时的输出:

Smith, John     610-555-7384
Barnes, Sarah   215-555-3827
Riley, Mark     733-555-2969
Getz, Laura     663-555-3984
Smith, Larry    464-555-3489
Phelps, Frank   322-555-2284
Grant, Marsha   243-555-2837

这是 排序后的输出:

Barnes, Sarah   215-555-3827
Getz, Laura     663-555-3984
Grant, Marsha   243-555-2837
Phelps, Frank   322-555-2284
Riley, Mark     733-555-2969
Smith, John     610-555-7384
Smith, Larry    464-555-3489

这是班级Sorting,我应该注意这是正确的:

 public class Sorting{
    /**
     * Swaps to elements in an array. Used by various sorting algorithms.
     * 
     * @param data the array in which the elements are swapped
     * @param index1 the index of the first element to be swapped
     * @param index2 the index of the second element to be swapped
     */
    private static <T extends Comparable<? super T>> void swap(T[] data,
            int index1, int index2){
        T temp = data[index1];
        data[index1] = data[index2];
        data[index2] = temp;
    }

    /**
     * Sorts the specified array of objects using the quick sort algorithm.
     * @param data the array to be sorted
     */
    public static <T extends Comparable<? super T>> void quickSort(T[] data){
        quickSort(data, 0, data.length - 1);
    }

    /**
     * Recursively sorts a range of objects in the specified array using the
     * quick sort algorithm. The parameters min and max represent the range of
     * values on which the sort is performed.
     * 
     * @param data the array to be sorted
     * @param min the minimum index in the range to be sorted
     * @param max the maximum index in the range to be sorted
     */
    public static <T extends Comparable<? super T>> void quickSort(T[] data,
            int min, int max){
        if (min < max){
            // create partitions
            int indexofpartition = partition(data, min, max);

            // sort the left partition (lower values)
            quickSort(data, min, indexofpartition - 1);

            // sort the right partition (higher values)
            quickSort(data, indexofpartition + 1, max);
        }
    }

    /**
     * Used by the quick sort algorithm to find the partition.
     * 
     * @param data the array to be sorted
     * @param min the minimum index in the range to be sorted
     * @param max the maximum index in the range to be sorted
     */
    private static <T extends Comparable<? super T>> int partition(
            T[] data, int min, int max){
       T partitionelement;
       int left, right;
       int middle = (min + max) / 2;

       // use the middle data value as the partition element
       partitionelement = data[middle];
       // move it out of the way for now
       swap(data, middle, min);

       left = min;
       right = max;

       while (left < right){
          // search for an element that is > the partition element
          while (left < right && data[left].compareTo(partitionelement) <= 0)
             left++;

          // search for an element that is < the partition element
          while (data[right].compareTo(partitionelement) > 0)
             right--;

          // swap the elements
          if (left < right)
             swap(data, left, right);
        }

       // move the partition element into place
       swap(data, min, right);

       return right;
    }

    /**
    * Sorts the specified array of objects using the merge sort
    * algorithm.
    *
    * @param data  the array to be sorted
    * @param min   the integer representation of the minimum value 
    * @param max   the integer representation of the maximum value
    */
    public static <T extends Comparable<? super T>> void mergeSort (T[] data, int min, int max){
       T[] temp;
       int index1, left, right;

       /** return on list of length one */
       if (min==max)
          return; 

       /** find the length and the midpoint of the list */
       int size = max - min + 1;
       int pivot = (min + max) / 2;
       temp = (T[])(new Comparable[size]);

       mergeSort(data, min, pivot); // sort left half of list
       mergeSort(data, pivot + 1, max); // sort right half of list

       /** copy sorted data into workspace */
       for (index1 = 0; index1 < size; index1++)
          temp[index1] = data[min + index1];

       /** merge the two sorted lists */
       left = 0;
       right = pivot - min + 1;
       for (index1 = 0; index1 < size; index1++){
          if (right <= max - min)
             if (left <= pivot - min)
                if (temp[left].compareTo(temp[right]) > 0)
                   data[index1 + min] = temp[right++];

                else
                   data[index1 + min] = temp[left++];
             else
                data[index1 + min] = temp[right++];
          else
             data[index1 + min] = temp[left++];
       }
    }

    public static <T extends Comparable<? super T>> void PbubbleSort(T[] theArray, int n) {
       // ---------------------------------------------------
       // Sorts the items in an array into ascending order.
       // Precondition: theArray is an array of n items.
       // Postcondition: theArray is sorted into ascending
       // order.  From Prichard&Carrano
       // ---------------------------------------------------
       boolean sorted = false;  // false when swaps occur

       for (int pass = 1; (pass < n) && !sorted; ++pass) {
          // Invariant: theArray[n+1-pass..n-1] is sorted
          //            and > theArray[0..n-pass]
          sorted = true;  // assume sorted
          for (int index = 0; index < n-pass; ++index) {
             // Invariant: theArray[0..index-1] <= theArray[index]
             int nextIndex = index + 1;
             if (theArray[index].compareTo(theArray[nextIndex]) > 0) {
                // exchange items
                T temp = theArray[index];
                theArray[index] = theArray[nextIndex];
                theArray[nextIndex] = temp;
                sorted = false;  // signal exchange
             }  // end if
          }  // end for

          // Assertion: theArray[0..n-pass-1] < theArray[n-pass]
       }  // end for
    }  // end bubbleSort

    public static <T extends Comparable<? super T>> void PinsertionSort(T[] theArray, int n) {
       // ---------------------------------------------------
       // Sorts the items in an array into ascending order.
       // Precondition: theArray is an array of n items.
       // Postcondition: theArray is sorted into ascending
       // order. FROM PRITCHARD & CARRANO
       // ---------------------------------------------------
       // unsorted = first index of the unsorted region,
       // loc = index of insertion in the sorted region,
       // nextItem = next item in the unsorted region

       // initially, sorted region is theArray[0],
       //          unsorted region is theArray[1..n-1];
       // in general, sorted region is theArray[0..unsorted-1],
       //          unsorted region is theArray[unsorted..n-1]

       for (int unsorted = 1; unsorted < n; ++unsorted) {
          // Invariant: theArray[0..unsorted-1] is sorted

          // find the right position (loc) in
          // theArray[0..unsorted] for theArray[unsorted],
          // which is the first item in the unsorted
          // region; shift, if necessary, to make room
          T nextItem = theArray[unsorted];
          int loc = unsorted;

          while ((loc > 0) &&
                (theArray[loc-1].compareTo(nextItem) > 0)) {
             // shift theArray[loc-1] to the right
             theArray[loc] = theArray[loc-1];
             loc--;
          }  // end while
          // Assertion: theArray[loc] is where nextItem belongs
          // insert nextItem into sorted region
          theArray[loc] = nextItem;
       }  // end for
    }  // end insertionSort 

    public static <T extends Comparable<? super T>> void selectionSort (T[] data){
       int min;
       T temp;

       for (int index = 0; index < data.length-1; index++){
          min = index;
          for (int scan = index+1; scan < data.length; scan++)
             if (data[scan].compareTo(data[min])<0)
                min = scan;

          /** Swap the values */
          temp = data[min];
          data[min] = data[index];
          data[index] = temp;
       }
    }
}

主要班级SortPhoneList

public class SortPhoneList{
   /**
    * Creates an array of Contact objects, sorts them, then prints
    * them.
    */
   public static void main (String[] args){

      Contact[] friends = new Contact[7];

      friends[0] = new Contact ("John", "Smith", "610-555-7384");
      friends[1] = new Contact ("Sarah", "Barnes", "215-555-3827");
      friends[2] = new Contact ("Mark", "Riley", "733-555-2969");
      friends[3] = new Contact ("Laura", "Getz", "663-555-3984");
      friends[4] = new Contact ("Larry", "Smith", "464-555-3489");
      friends[5] = new Contact ("Frank", "Phelps", "322-555-2284");
      friends[6] = new Contact ("Marsha", "Grant", "243-555-2837");


      Sorting.quickSort(friends, 0, friends.length-1);

      Sorting.mergeSort(friends, 0, friends.length-1);

      Sorting.PbubbleSort(friends, 0, friends.length-1);

      Sorting.PinsertionSort(friends, 0, friends.length-1);

      Sorting.selectionSort(friends, 0, friends.length-1);


      for (int index = 0; index < friends.length; index++)
         System.out.println (friends[index]);
   }

1 个答案:

答案 0 :(得分:1)

那些排序算法都运行良好。 (鉴于评论的风格各不相同,我认为你是通过互联网或书籍从不同来源收集的。)

问题在于你以错误的方式调用。请注意,这些不同的方法具有不同的参数:有些只需要对数据进行排序,有些需要数据的长度,有些需要长度减去1。这些信息可以在每种方法顶部的文档中找到。

尝试使用此main方法测试各种排序:

public static void main(String[] args) {

    // create random test data
    Random random = new Random();
    Integer[] data = new Integer[50];
    for (int i = 0; i < data.length; i++) {
        data[i] = random.nextInt(100);
    }

    // print unsorted data
    System.out.println(Arrays.asList(data));
    // uncomment the algorithm you want to test
    quickSort(data);
//  mergeSort(data, 0, data.length - 1);
//  selectionSort(data);
//  PinsertionSort(data, data.length);
//  PbubbleSort(data, data.length);
    // print sorted data
    System.out.println(Arrays.asList(data));
}