1. 程式人生 > >經典排序演算法(Java版)

經典排序演算法(Java版)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

                  經典排序演算法( Java 版) 權當複習,以備引用(理論來源於:http://www.zsqz.com/jsbase/Suanfa/index.html?defination.htm
感謝該網站。JAVA原始碼為我所寫)
1、氣泡排序 Bubble Sort 最簡單的排序方法是氣泡排序方法。這種方法的基本思想是,將待排序的元素看作是豎著排列的 氣泡 ,較小的元素比較輕,從而要往上浮。在氣泡排序演算法中我們要對這個 氣泡 序列處理若干遍。所謂一遍處理,就是自底向上檢查一遍這個序列,並時刻注意兩個相鄰的元素的順序是否正確。如果發現兩個相鄰元素的順序不對,即 的元素在下面,就交換它們的位置。顯然,處理一遍之後, 最輕 的元素就浮到了最高位置;處理二遍之後,
次輕 的元素就浮到了次高位置。在作第二遍處理時,由於最高位置上的元素已是 最輕 元素,所以不必檢查。一般地,第 i 遍處理時,不必檢查第 i 高位置以上的元素,因為經過前面 i-1 遍的處理,它們已正確地排好序。這個演算法可實現如下。 演算法如下: /**       * 氣泡排序       * @param src
待排序陣列       */     void doBubbleSort( int [] src)     {        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);        }          } 2、選擇排序 Selection Sort 選擇排序的基本思想是:對待排序的記錄序列進行 n-1 遍的處理,第 1 遍處理是將 L[1..n] 中最小者與 L[1] 交換位置,第 2 遍處理是將 L[2..n] 中最小者與 L[2] 交換位置, ...... ,第 i 遍處理是將 L[i..n] 中最小者與 L[i] 交換位置。這樣,經過 i 遍處理之後,前 i 個記錄的位置就已經按從小到大的順序排列好了。
  當然,實際操作時,也可以根據需要,通過從待排序的記錄中選擇最大者與其首記錄交換位置,按從大到小的順序進行排序處理。 演算法如下:        /**       * 選擇排序       * @param src 待排序的陣列       */     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 迴圈實現 )       * @param src 待排序陣列       */     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 迴圈實現 )       * @param src 待排序陣列       */     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);        }     }               

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述