2015-04-24 110 views
6

好的,所以我有一個泡泡排序,選擇排序和插入排序的實現。我使用Java.Random對象來創建三個相同的十萬個數字的數組。我依次將這些傳遞給每種排序方法。我正在使用System.nanotime計時結果。爲什麼我的基於Java的泡泡排序優於我的選擇排序和我的插入排序

有關背景信息。我選擇和插入排序的排序算法來自Frank Carano的「Java第三版中的數據結構和抽象」。泡沫排序是我的頭頂。

下面我提供了一個自包含的類來執行所有這些。卡拉諾的算法出錯了,我沒有看到它?

下面你會看到我正在計算基礎操作的週期和完成時間。在運行時,週期數可以忽略不計。對於我來說,在完成時間看,泡泡是第一,選擇是第二,插入是第三。這在傳統智慧面前飛逝。爲什麼。我做了一些相當愚蠢的事情嗎?

順便說一句,你應該能夠編譯並運行提供的代碼而不做任何改變。

import java.util.Random; 


/** 
* 
* Performs sorts on generic data, here using Integers. 
*/ 
public class GenSorts { 

    static int selectionCount = 0, bubbleCount = 0, insertionCount = 0;; 

    //========================================================================= 
    /** 
    * Do an insertion sort. 
    * @param data The array to sort 
    * @param first The index of the first element 
    * @param lasr The index of the last element 
    */ 
    //========================================================================= 
    public static <T extends Comparable<? super T>> void insertionSort(T[]array, int first, int last){ 

     for(int untouch = first + 1; untouch < last; untouch++){ 
      T nextToInsert = array[untouch]; 

      insertInOrder(nextToInsert, array, first, untouch-1); 

     }//end for 
    }//========================================================================= 

    //========================================================================= 
    /** 
    * Performs the shuffle and insert part of the insertion sort. 
    * @param anEntry The value to insert 
    * @param array The target array 
    * @param begin The begin of the unsorted part. 
    * @param end The end of the unsorted part. 
    */ 
    //========================================================================= 
    public static <T extends Comparable<? super T>> void insertInOrder(T anEntry, T[]array, int begin, int end){ 

     int index = end; 
     //Do a shunt while an entry is less than the value at the index 
     while((index >= begin) && (anEntry.compareTo(array[index]) < 0) ){ 
      array[index+1] = array[index]; 
      index --; 
      insertionCount++; 
     } 

     array[index+1] = anEntry;//Insert 
    }//====================================================================== 


    //====================================================================== 
    /** 
    * BUBBLE SORT/////////////////////////////////////////////////////////// 
    * Perform a bubble sort on the data. 
    * @param data The array to be sorted. 
    */ 
    //====================================================================== 
    public static <T extends Comparable <? super T> >void bubbleSort (T[] data) 
    { 
     Boolean swapped = true; 
     int stop = data.length -1; 


     while (swapped) { 
      swapped = false; 

      for (int x = 0; x < stop ; x++) { 
       bubbleCount++; 
       //if x smaller than x +1 swap 
       if (data[x].compareTo( data[x+1] ) > 0) { 

         swap(x, x+1, data); 
         swapped = true; 
       }//end if 

       stop --; 

      }//end for 

     }//end while 
    }//end method============================================================ 


    //======================================================================== 
    /** 
    * SELECTION SORT///////////////////////////////////////////////////////// 
    * A selection sort algorithm to sort data. 
    * @param data 
    * @return 
    */ 
    //======================================================================== 
    public static <T extends Comparable<? super T> > void selectionSort(T[] data, int n){ 

     for (int index = 0; index < n - 1; index++) 
      { 
      selectionCount++; 
      int min = getSmallestIndex(index, n,data); 

      swap( index, min, data); 

      //DISPLAYME 
      // displaySelectionArray(index, min, data); 
      } 

    }//======================================================================== 



    //========================================================================== 
    /** 
    * Get the index of the smallest item in the array from start to end/ 
    * @param start The place in the array to start looking. 
    * @param end The place in the array to end looking. 
    * @param array The array to inspect. 
    * @returnThe index of the smallest. 
    */ 
    //========================================================================== 
    private static <T extends Comparable<? super T>> int getSmallestIndex(int start, int end, T[] array) 
     { 
      T min = array[start];//value of smallest 
      int minIndex = start;//index of smallest 
      for (int i = start + 1; i < end; i++) 
      { 

      // System.out.print(array[i].toString() + ", "); 
      if (array[i].compareTo(min) < 0) 
      { 
       minIndex = i; 
       min = array[i]; 
      }//end if 
      }//end for 

     // System.out.println(""); 
      return minIndex; 
     }//======================================================================== 


    //========================================================================= 
    /** 
    * Swap emelement numbers j and iMin in array data. 
    * @param j 
    * @param iMin 
    * @param data 
    */ 
    //========================================================================= 
    public static<T extends Comparable <? super T> > void swap(int j, int iMin, T[] data){ 

     T temp = data[j]; 
     data[j] = data[iMin]; 
     data[iMin] = temp; 
    }//end swap================================================================ 


    public static Integer[] largeRandom1, largeRandom2, largeRandom3; 

    //======================================================================== 
    /** 
    * Generate large integers for sorting. 
    * @param n The value of n. 
    */ 
    //======================================================================== 
    public static void genLargeRandom(int n){ 
     Random r = new Random(); 
     largeRandom1 = new Integer[n]; 
     largeRandom2 = new Integer[n]; 
     largeRandom3 = new Integer[n]; 


     for(int i = 0; i < n; i++){ 
      largeRandom1[i] = r.nextInt(100); 
      largeRandom2[i] = largeRandom1[i]; 
      largeRandom3[i] = largeRandom1[i]; 
     }//end for 
    }//end genLarge//========================================================== 

    //========================================================================= 
    /** 
    * Sort a large numvber. 
    * @param args 
    */ 
    //========================================================================= 
    public static void main(String[] args){ 

     genLargeRandom(100000);//one hundred thousand 
     Integer[] data = largeRandom1;///{40, 3, 2, 7, 4}; 
     Integer[] data2 = largeRandom2; 
     Integer[] data3 = largeRandom3; 


     System.out.println("BUBBLE SORT!!"); 
     Long t1s = System.nanoTime(); 
     bubbleSort(data);///////////////Bubble Sort 
     Long t1e = System.nanoTime(); 

     System.out.println("SELECTION SORT!!"); 
     Long t2s = System.nanoTime(); 
     selectionSort(data2, data2.length);///////////////Selection Sort 
     Long t2e = System.nanoTime(); 


     System.out.println("INSERTION SORT!!"); 
     Long t3s = System.nanoTime(); 
     insertionSort(data3,0, data3.length);////////////Insertion Sort 
     Long t3e = System.nanoTime(); 


     System.out.println("Bubble Time: " + (t1e - t1s)); 
     System.out.println("Selection Time: " + (t2e - t2s)); 
     System.out.println("insertion Time: " + (t3e - t3s)); 

     System.out.println("Bubble count: " + bubbleCount); 
     System.out.println("Selection ccount :" + selectionCount); 
     System.out.println("Insertion ccount :" + selectionCount); 


    }//======================================================================== 

}//############################################################################ 
+1

我投票結束這個問題作爲題外話,因爲它開到[codereview](http://codereview.stackexchange.com/)。 –

+0

請參閱[我如何寫一個正確的micro-benchmark-in-java](http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-基準測試) –

+0

什麼?不要瘋狂......如果遵循該規則,大多數主題都應該關閉,因爲堆棧交換有太多的計算主題**,因此會導致StackOverflow冗餘。 –

回答

5

你搞砸了你的氣泡排序。嘗試打印一個簡單的輸入結果,你會清楚地看到這一點;例如,嘗試排序(3, 2, 1)給出(2, 3, 1)。你錯過了stop--

public static <T extends Comparable <? super T> >void bubbleSort (T[] data) 
{ 
    Boolean swapped = true; 
    int stop = data.length -1; 


    while (swapped) { 
     swapped = false; 

     for (int x = 0; x < stop ; x++) { 
      bubbleCount++; 
      //if x smaller than x +1 swap 
      if (data[x].compareTo( data[x+1] ) > 0) { 

        swap(x, x+1, data); 
        swapped = true; 
      }//end if 

      stop --; // needs to go outside the for 

     }//end for 

    }//end while 
}//end method============================================================ 
+1

剛剛得出同樣的結論。在開始基準測試之前,OP確實應該檢查他的方法的結果。如果時間沒有那麼大的差別,他甚至不會注意到。 – Fox

+0

是的。測試正確性,然後*性能。 – user2357112

+3

Doh,買那個人午餐按鈕的地方在哪裏。我一整晚都在工作很晚。非常感謝成爲第二雙眼睛。現在的泡沫分類如我所希望的那樣可怕。非常感謝。 –