經典排序演算法(Java版)
阿新 • • 發佈:2018-11-06
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
經典排序演算法( Java 版) 權當複習,以備引用(理論來源於:http://www.zsqz.com/jsbase/Suanfa/index.html?defination.htm當然,實際操作時,也可以根據需要,通過從待排序的記錄中選擇最大者與其首記錄交換位置,按從大到小的順序進行排序處理。 演算法如下: /** * 選擇排序 * @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); } }