冒泡排序,選擇排序,插入排序

冒泡排序,選擇排序,插入排序

       小規模的文件以及基本有序的文件,插入排序的性能比快速排序的性能更爲有效一些,實際上,插入排序通常也做快速排序實現的一部分。

 

1 冒泡排序:

       package datastrut;

 

public class BubbleSort {

 

    /**

     * 冒泡排序

     * @param args

     */

   

    private long[] a ;

    private int nElems;

    public BubbleSort(int max){

       a = new long[max];

       nElems = 0 ;

    }

    public void insert(long value){

       a[nElems] = value;

       nElems++;

    }

    public void display(){

       for(int i = 0 ;i<nElems; i++)

           System.out.print(a[i] + " ");

       System.out.println(" ");

    }

    public void swap(int one,int two){

       long temp = a[one];

       a[one] = a[two];

       a[two] = temp;

      

    }

    public void bubbleSort(){

       int out,in;

       for(out = nElems-1;out>1;out--){

           for(in = 0 ; in < out; in++){

              if(a[in]>a[in+1]){

                  swap(in,in+1);

              }

           }

       }

      

    }

   

   

    public static void main(String[] args) {

       // TODO Auto-generatedmethod stub

       int maxsize = 100;

       BubbleSort b= new BubbleSort(maxsize);

       b.insert(12);

       b.insert(45);

       b.insert(65);

       b.insert(34);

       b.insert(76);

       b.insert(13);

       b.insert(15);

       b.insert(78);

       b.insert(67);

       b.insert(76);

      

       b.display();

       b.bubbleSort();

       b.display();

      

    }

 

}

 

效率:(n-1)+(n-2)+…+1= n*(n-1)/2     大約 O(n^2)

 

       比較次數大約:n^2/2   交換次數:n^2/4

 

 

 

 

2,選擇排序:

   冒泡排序的一種改進,交換次數從O(n^2)減少到O(n),但比較次數仍爲O(n^2)

 

    /*

     * 選擇排序

     * */

    public void selectSort(){

       int min,out,in;

       for(out = 0;out < nElems - 1; out++){

           min = out;

           for(in = out + 1; in < nElems;in++){

              if(a[in] > a[min])

                  swap(in,min);

           }

          

       }

      

      

    }

選擇排序的效率:O(n^2)

       交換次數從O(n^2)減少到O(n),但比較次數仍爲O(n^2)

       當N值較小時,特別是如果交換的時間級比比較時間級大得多時,選擇排序實際上是相當快的。

 

3,插入排序

       仍然需要O(n^2) ,但是一般情況下,它要比冒泡排序快一倍,比選擇排序還要快一點。

    /*

     * 插入排序

     * */

    public void insertSort(){

       int in,out;

       for(out = 1; out < nElems;out++){

           long temp = a[out];

           in = out;

           while(in > 0 && a[in-1] >= temp){

              a[in] = a[in-1];

              --in;

           }

           a[in] = temp;

       }

    }

 

插入排序性能:對於已經有序或者基本有序的數據來說,插入排序要好得多。當數據有序的時候,while循環的條件總是假,所以他變成了外層循環中的一個簡單語句,執行n-1次,O(n)。

如果數據基本有序,插入排序幾乎只需要O(n)的時間。

 

 

三種性能比較:

1, 冒泡:數據量小的時候。交換O(n^2),比較O(n^2)

2, 選擇:數據量小,交換數據相對於比較數據更加耗時時。交換O(n),比較O(n^2)

3, 插入:數據量小或者基本有序時。複製O(n^2),比較O(n^2) 一次複製與一次交換的時間耗費不同。

都需要一個額外的變量來暫時存儲交換時的數據項。



舍拉官方店

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章