计算BubbleSort,QuickSort中的比较

时间:2015-11-20 17:22:42

标签: java big-o

我正在尝试正确计算每种算法的比较次数,但我不认为我将我的计数器放在正确的位置。

SortsMain是测试客户端。

public class SortsMain {

  public static void main(String[] args) {

    Scanner scan = new Scanner(System.in);
    Random ranNum = new Random();

    System.out.println("Enter size of Array: ");
    int sizeOfArray = scan.nextInt();

    Comparable array[] = new Comparable[sizeOfArray];

    System.out.println("Size of Array is: " + sizeOfArray);

    System.out.println("Unsorted array: ");
    for (int a = 0; a < sizeOfArray; a++) {
        array[a] = ranNum.nextInt(2147483647);
        System.out.print(array[a] + ", ");
    }

    System.out.println("Press 1 to use Bubble Sort");
    System.out.println("Press 2 to use Quick Sort");

    int typeOfSortChoice = scan.nextInt();

    //bubble sort
    if (typeOfSortChoice == 1) {
        SortsClass.bubbleSort(array, sizeOfArray);
        //6 numbers = 15 comparisons (5+4+3+2+1)
        //comparisons = (n*(n-1)/2)
    }

    //quick sort
    if (typeOfSortChoice == 2) {
        SortsClass.quickSort(array, 0, array.length - 1);
    }      
    /*for (int a = 0; a < sizeOfArray; a++){
        System.out.println(array[a]);
    }*/

    System.out.print(Arrays.toString(array) + '\n');

    System.out.println();
  }
}

SortsClass包含冒泡排序和快速排序方法。

    // The file contains 5 static methods for sorting arrays of Comparable items
    // It will compile with warnings about unchecked exceptions

public class SortsClass {

    static int comparisonCounter = 0;
    static int comparisonCounter2 = 0;


    //Comparable[] theArray = new Comparable[theArray.length];

    public static void selectionSort(Comparable[] 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.
    // Calls: indexOfLargest.
    // ---------------------------------------------------
    // last = index of the last item in the subarray of
    // items yet to be sorted
    // largest = index of the largest item found
    {
        for (int last = n - 1; last >= 1; last--) {
            // Invariant: theArray[last+1..n-1] is sorted
            // and > theArray[0..last]
            // select largest item in theArray[0..last]
            int largest = indexOfLargest(theArray, last + 1);
            // swap largest item theArray[largest] with
            // theArray[last]
            Comparable temp = theArray[largest];
            theArray[largest] = theArray[last];
            theArray[last] = temp;
        } // end for
    } // end selectionSort

    /*******************************************************************************/
    private static int indexOfLargest(Comparable[] theArray, int size)
    // ---------------------------------------------------
    // Finds the largest item in an array.
    // Precondition: theArray is an array of size items;
    // size >= 1.
    // Postcondition: Returns the index of the largest
    // item in the array.
    // ---------------------------------------------------
    {
        int indexSoFar = 0; // index of largest item found so far
        // Invariant: theArray[indexSoFar]>=theArray[0..currIndex-1]
        for (int currIndex = 1; currIndex < size; ++currIndex) {
            if (theArray[currIndex].compareTo(theArray[indexSoFar]) > 0) {
                indexSoFar = currIndex;
            } // end if
        } // end for
        return indexSoFar; // index of largest item
    } // end indexOfLargest

    /*************************
     * Dumb Bubble
     ********************************/
    public static void bubbleSort(Comparable[] 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.
    // ---------------------------------------------------
    {
        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) {
                comparisonCounter++;

                // Invariant: theArray[0..index-1] <= theArray[index]
                int nextIndex = index + 1;

                if (theArray[index].compareTo(theArray[nextIndex]) > 0) {

                    // exchange items
                    Comparable temp = theArray[index];
                    theArray[index] = theArray[nextIndex];
                    theArray[nextIndex] = temp;
                    sorted = false; // signal exchange


                } // end if
                //System.out.println(theArray[index]);
            } // end for

            // Assertion: theArray[0..n-pass-1] < theArray[n-pass]
        } // end for
        System.out.println("Number of Comparisons made: " + comparisonCounter);
        for (int i = 0; i < theArray.length; i++) {
            System.out.println(theArray[i]);
        }
    } // end bubbleSort

    /*******************************************************************************/
    public static void insertionSort(Comparable[] 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.
    // ---------------------------------------------------
    // 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];
    {
        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
            Comparable 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
            // insert nextItem into sorted region
            theArray[loc] = nextItem;
        } // end for
    } // end insertionSort

    /**************************************************************************************/
    private static void merge(Comparable[] theArray, int first, int mid, int last)
    // ---------------------------------------------------------
    // Merges two sorted array segments theArray[first..mid] and
    // theArray[mid+1..last] into one sorted array.
    // Precondition: first <= mid <= last. The subarrays
    // theArray[first..mid] and theArray[mid+1..last] are
    // each sorted in increasing order.
    // Postcondition: theArray[first..last] is sorted.
    // Implementation note: This method merges the two
    // subarrays into a temporary array and copies the result
    // into the original array anArray.
    // ---------------------------------------------------------
    {
        int maxSize = theArray.length;
        // temporary array
        Comparable[] tempArray = new Comparable[maxSize];
        // initialize the local indexes to indicate the subarrays
        int first1 = first; // beginning of first subarray
        int last1 = mid; // end of first subarray
        int first2 = mid + 1; // beginning of second subarray
        int last2 = last; // end of second subarray
        // while both subarrays are not empty, copy the
        // smaller item into the temporary array
        int index = first1; // next available location in
        // tempArray
        while ((first1 <= last1) && (first2 <= last2)) {
            // Invariant: tempArray[first1..index-1] is in order
            if (theArray[first1].compareTo(theArray[first2]) < 0) {
                tempArray[index] = theArray[first1];
                first1++;
            } else {
                tempArray[index] = theArray[first2];
                first2++;
            } // end if
            index++;
        } // end while
        // finish off the nonempty subarray
        // finish off the first subarray, if necessary
        while (first1 <= last1) {
            // Invariant: tempArray[first1..index-1] is in order
            tempArray[index] = theArray[first1];
            first1++;
            index++;
        } // end while
        // finish off the second subarray, if necessary
        while (first2 <= last2) {
            // Invariant: tempArray[first1..index-1] is in order
            tempArray[index] = theArray[first2];
            first2++;
            index++;
        } // end while
        // copy the result back into the original array
        for (index = first; index <= last; ++index) {
            theArray[index] = tempArray[index];
        } // end for
    } // end merge

    /**************************************************************************/
    public static void mergesort(Comparable[] theArray, int first, int last)
    // ---------------------------------------------------------
    // Sorts the items in an array into ascending order.
    // Precondition: theArray[first..last] is an array.
    // Postcondition: theArray[first..last] is sorted in
    // ascending order.
    // Calls: merge.
    // ---------------------------------------------------------
    {
        if (first < last) {
            // sort each half
            int mid = (first + last) / 2; // index of midpoint
            // sort left half theArray[first..mid]
            mergesort(theArray, first, mid);
            // sort right half theArray[mid+1..last]
            mergesort(theArray, mid + 1, last);
            // merge the two halves
            merge(theArray, first, mid, last);
        } // end if
    } // end mergesort

    /*******************************************************************************/
    private static void choosePivot(Comparable[] theArray, int first, int last)
    // ---------------------------------------------------------
    // Chooses a pivot for quicksort's partition algorithm and
    // swaps it with the first item in an array.
    // Precondition: theArray[first..last] is an array;
    // first <= last.
    // Postcondition: theArray[first] is the pivot.
    // ---------------------------------------------------------
    {
        //Technically you don't have to do anything here. It's not
        // a great way to do it, but it will work! If you want to
        // use a technique from the book, you can.
    } // end choosePivot

    /******************************************************************************/
    private static int partition(Comparable[] theArray, int first, int last)
    // ---------------------------------------------------------
    // Partitions an array for quicksort.
    // Precondition: theArray[first..last] is an array;
    // first <= last.
    // Postcondition: Returns the index of the pivot element of
    // theArray[first..last]. Upon completion of the method,
    // this will be the index value lastS1 such that
    // S1 = theArray[first..lastS1-1] < pivot
    // theArray[lastS1] == pivot
    // S2 = theArray[lastS1+1..last] >= pivot
    // Calls: choosePivot.
    // ---------------------------------------------------------
    // tempItem is used to swap elements in the array
    {
        Comparable tempItem;
        // place pivot in theArray[first]
        choosePivot(theArray, first, last);
        Comparable pivot = theArray[first]; // reference pivot
        // initially, everything but pivot is in unknown
        int lastS1 = first; // index of last item in S1
        // move one item at a time until unknown region is empty
        for (int firstUnknown = first + 1; firstUnknown <= last; ++firstUnknown) {
            // Invariant: theArray[first+1..lastS1] < pivot
            // move item from unknown to proper region
            if (theArray[firstUnknown].compareTo(pivot) < 0) {
                // item from unknown belongs in S1
                ++lastS1;
                tempItem = theArray[firstUnknown];
                theArray[firstUnknown] = theArray[lastS1];
                theArray[lastS1] = tempItem;
                comparisonCounter2++;
            } // end if
            // else item from unknown belongs in S2
        } // end for
        // place pivot in proper position and mark its location
        tempItem = theArray[first];
        theArray[first] = theArray[lastS1];
        theArray[lastS1] = tempItem;


        return lastS1;


    } // end partition

  /***********************************************************************/
    public static void quickSort(Comparable[] theArray, int first, int last) {
        // ---------------------------------------------------------
        // Sorts the items in an array into ascending order.
        // Precondition: theArray[first..last] is an array.
        // Postcondition: theArray[first..last] is sorted.
        // Calls: partition.
        // ---------------------------------------------------------
        int pivotIndex;
        if (first < last) {
            // create the partition: S1, Pivot, S2
            pivotIndex = partition(theArray, first, last);
            // sort regions S1 and S2
            quickSort(theArray, first, pivotIndex - 1);
            quickSort(theArray, pivotIndex + 1, last);
        } // end if
    } // end quickSort
} // end SortsClass

要复制问题,请运行SortsMain类,输入数组大小以及使用哪种算法。比较的数量会打印,但显然是错误的。

在SortsClass类中找到名为comparisonCounter和comparisonCounter2的循环计数器。一切都正确排序,但柜台在错误的地方。

1 个答案:

答案 0 :(得分:0)

试试这个

for (int firstUnknown = first + 1; firstUnknown <= last; ++firstUnknown) {
    if (theArray[firstUnknown].compareTo(pivot) < 0) {
        ++lastS1;
        tempItem = theArray[firstUnknown];
        theArray[firstUnknown] = theArray[lastS1];
        theArray[lastS1] = tempItem;
    } 
    comparisonCounter2++;  //move outside of if statement
    System.out.println(comparisonCounter2);
} 

输出

Enter size of Array: 
3
Size of Array is: 3
Unsorted array: 
210357065, 1990514425, 960664583, Press 1 to use Bubble Sort
Press 2 to use Quick Sort
2
1
2
3
[210357065, 960664583, 1990514425]