經典排序算法(Java版)



一、冒泡排序 Bubble Sort算法

最簡單的排序方法是冒泡排序方法。這種方法的基本思想是,將待排序的元素看做是豎着排列的氣泡,較小的元素比較輕,從而要往上浮。在冒泡排序算法中咱們要對這個氣泡序列處理若干遍。所謂一遍處理,就是自底向上檢查一遍這個序列,並時刻注意兩個相鄰的元素的順序是否正確。若是發現兩個相鄰元素的順序不對,即的元素在下面,就交換它們的位置。顯然,處理一遍以後,最輕的元素就浮到了最高位置;處理二遍以後,次輕的元素就浮到了次高位置。在做第二遍處理時,因爲最高位置上的元素已經是最輕元素,因此沒必要檢查。通常地,第i遍處理時,沒必要檢查第i高位置以上的元素,由於通過前面i-1遍的處理,它們已正確地排好序。這個算法可實現以下。數組

算法以下:spa

/**排序

     *冒泡排序io

     *@paramsrc待排序數組循環

     */程序

    void doBubbleSort(int[] src)方法

    {im

       int len=src.length;數據

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

       {

           for(int j=i+1;j<len;j++)

           {

              int temp;

              if(src[i]>src[j])

              {

                  temp=src[j];

                  src[j]=src[i];

                  src[i]=temp;

              }            

           }

           printResult(i,src);

       }     

    }

二、選擇排序 Selection Sort

選擇排序的基本思想是:對待排序的記錄序列進行n-1遍的處理,第1遍處理是將L[1..n]中最小者與L[1]交換位置,第2遍處理是將L[2..n]中最小者與L[2]交換位置,......,第i遍處理是將L[i..n]中最小者與L[i]交換位置。這樣,通過i遍處理以後,前i個記錄的位置就已經按從小到大的順序排列好了。
  固然,實際操做時,也能夠根據須要,經過從待排序的記錄中選擇最大者與其首記錄交換位置,按從大到小的順序進行排序處理。

算法以下:

       /**

     *選擇排序

     *@paramsrc待排序的數組

     */

    void doChooseSort(int[] src)

    {

       int len=src.length;

       int temp;

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

       {

           temp=src[i];

           int j;

           int samllestLocation=i;//最小數的下標

           for(j=i+1;j<len;j++)

           {

              if(src[j]<temp)

              {

                  temp=src[j];//取出最小值

                  samllestLocation=j;//取出最小值所在下標

              }

           }

           src[samllestLocation]=src[i];

           src[i]=temp;

           printResult(i,src);

       }

    }

3、插入排序 Insertion Sort

插入排序的基本思想是,通過i-1遍處理後,L[1..i-1]己排好序。第i遍處理僅將L[i]插入L[1..i-1]的適當位置,使得L[1..i]又是排好序的序列。要達到這個目的,咱們能夠用順序比較的方法。首先比較L[i]和L[i-1],若是L[i-1]≤ L[i]騆[1..i]已排好序,第i遍處理就結束了;不然交換L[i]與L[i-1]的位置,繼續比較L[i-1]和L[i-2],直到找到某一個位置j(1≤j≤i-1),使得L[j] ≤L[j+1]時爲止。
  簡言之,插入排序就是每一步都將一個待排數據按其大小插入到已經排序的數據中的適當位置,直到所有插入完畢。插入排序方法分直接插入排序和折半插入排序兩種,這裏只介紹直接插入排序,折半插入排序留到「查找」內容中進行。
  圖1演示了對4個元素進行直接插入排序的過程,共須要(a),(b),(c)三次插入。

圖1 對4個元素進行插入排序

在下面的插入排序算法中,爲了寫程序方便咱們能夠引入一個哨兵元素L[0],它小於L[1..n]中任一記錄。因此,咱們設元素的類型ElementType中有一個常量-∞,它比可能出現的任何記錄都小。若是常量-∞很差事先肯定,就必須在決定L[i]是否向前移動以前檢查當前位置是否爲1,若當前位置已經爲1時就應結束第i遍的處理。另外一個辦法是在第i遍處理開始時,就將L[i]放入L[0]中,這樣也能夠保證在適當的時候結束第i遍處理。下面的算法中將對當前位置進行判斷。

算法以下:

    /**

     *插入排序(WHILE循環實現)

     *@paramsrc待排序數組

     */

    void doInsertSort1(int[] src)

    {

       int len=src.length;

       for(int i=1;i<len;i++)

       {  

           int temp=src[i];

           int j=i;

          

           while(src[j-1]>temp)

           {

              src[j]=src[j-1];

              j--;

              if(j<=0)

                  break;

           }

           src[j]=temp;

           printResult(i+1,src);

       }

    }

    /**

     *插入排序(FOR循環實現)

     *@paramsrc待排序數組

     */

    void doInsertSort2(int[] src)

    {

       int len=src.length;

       for(int i=1;i<len;i++)

       {

           int j;

           int temp=src[i];

           for(j=i;j>0;j--)

           {

              if(src[j-1]>temp)

              {

                  src[j]=src[j-1];

                 

              }else//若是當前的數,不小前面的數,那就說明不小於前面全部的數,

                   //由於前面已是排好了序的,因此直接通出當前一輪的比較

                  break;

           }

           src[j]=temp;

           printResult(i,src);

       }

    }

相關文章
相關標籤/搜索