不扯太多概念性的東西,簡單點來說,插入排序 將數組所有元素劃分成了有序區和無序區,假設當前數組有 N 個元素, 開始默認第一個元素(下標為0)所處的位置是有序區,這是局部有序,從第二個元素(i=1)至數組最后一個元素(i=N-1)屬于無序區;假設數組元素是按從左至右存放的, 如果用 i 來標記無序區中的第一個元素下標,也就是無序區中最左邊或者說是無序區中下標值最小的下標, 則每趟排序是將下標 i 所指向的有效值插入有序區的適當位置,使得每趟排序完成之后,有序區的所有元素總是保持局部有序狀態。 按這樣來回 N -1 趟插入之后,則 N 個元素已成有序狀態。 盡管插入排序的復雜度也是 O(n^2),但一般情況下,插入排序會比冒泡排序快一倍,要比選擇排序還要快一點。 排序基類:BaseSort.java
package sort; /** * ----------------------------------------- * @文件: BaseSort.java * @作者: fancy * @郵箱: fancydeepin@yeah.net * @時間: 2012-7-18 * @描述: 基類 * ----------------------------------------- */ public class BaseSort { protected final static int ASC = 1 ; // 升序 protected final static int DESC = 0 ; // 降序 // 交換i1、i2下標指向的值 public void swap(Object[] array, int i1, int i2) { Object tempObj; tempObj = array[i1]; array[i1] = array[i2]; array[i2] = tempObj; tempObj = null ; } // 打印輸出數組元素 public void print(Object[] array) { for (Object obj : array) { System.out.print(obj + " " ); } System.out.println(); } } 插入排序:InsertSort.java
package sort; /** * ----------------------------------------- * @文件: InsertSort.java * @作者: fancy * @郵箱: fancydeepin@yeah.net * @時間: 2012-7-18 * @描述: 插入排序 * ----------------------------------------- */ public class InsertSort extends BaseSort { /** * @方法名: insertSort * @參數名: array 排序對象 * @參數名: order 排序順序 * @描述語: 插入排序:默認第一個是有序,使其余的像紙牌游戲那樣依次插入,復雜度 O(n^2) */ public void insertSort(Object[] array, int order) { int length = array.length; if ( order == ASC ) { for ( int i = 1 , j ; i < length; i ++ ) { // 默認第1個(下標0)有序,i是無序區第一個元素下標,第i趟結束后,i下移,如此來回 N -1趟 for (j = 0 ; j < i; j ++ ) { // 將無序區下標為i所指向的值插入有序區適當位置 if (Double.parseDouble(array[j].toString()) > Double.parseDouble(array[i].toString())) { swap(array, i, j); } } System.out.println(" --------------------------------------------------------------------------->第 " + i + " 趟 " ); print(array); } }else if ( order == DESC ) { for ( int i = 1 , j; i < length; i ++ ) { // 默認第1個(下標0)有序,i是無序區第一個元素下標,第i趟結束后,i下移,如此來回 N -1趟 for (j = 0 ; j < i; j ++ ) { // 將無序區下標為i所指向的值插入有序區適當位置 if (Double.parseDouble(array[j].toString()) < Double.parseDouble(array[i].toString())) { swap(array, i, j); } } System.out.println(" --------------------------------------------------------------------------->第 " + i + " 趟 " ); print(array); } } } } 如需了解上面由粉紅色標記出來的代碼的用意,請參考我 java 分類里的 冒泡排序 這一隨筆 : http://www.aygfsteel.com/fancydeepin/archive/2012/07/18/java_bubblesort.html 測試類:TestApp.java
package sort; /** * ----------------------------------------- * @文件: TestApp.java * @作者: fancy * @郵箱: fancydeepin@yeah.net * @時間: 2012-7-18 * @描述: 測試類 * ----------------------------------------- */ public class TestApp { public static void main(String[] args) { Object[] array = { 9 , 5 , 7 , 1 , 6 , 3 , 8 , 10 , 4 , 2 } ; ( new InsertSort()).insertSort(array, InsertSort.ASC); } } 后臺輸出打印結果:
---------------------------------------------------------------------------> 第1趟 5 9 7 1 6 3 8 10 4 2 ---------------------------------------------------------------------------> 第2趟 5 7 9 1 6 3 8 10 4 2 ---------------------------------------------------------------------------> 第3趟 1 5 7 9 6 3 8 10 4 2 ---------------------------------------------------------------------------> 第4趟 1 5 6 7 9 3 8 10 4 2 ---------------------------------------------------------------------------> 第5趟 1 3 5 6 7 9 8 10 4 2 ---------------------------------------------------------------------------> 第6趟 1 3 5 6 7 8 9 10 4 2 ---------------------------------------------------------------------------> 第7趟 1 3 5 6 7 8 9 10 4 2 ---------------------------------------------------------------------------> 第8趟 1 3 4 5 6 7 8 9 10 2 ---------------------------------------------------------------------------> 第9趟 1 2 3 4 5 6 7 8 9 10 [ 轉載出處:http://www.aygfsteel.com/fancydeepin ]
主站蜘蛛池模板:
共和县 |
双江 |
镇宁 |
无棣县 |
大兴区 |
荥经县 |
黔西 |
元朗区 |
招远市 |
申扎县 |
合作市 |
白山市 |
盐城市 |
苍溪县 |
冕宁县 |
灵山县 |
思南县 |
辰溪县 |
大新县 |
茌平县 |
荣昌县 |
沙湾县 |
石泉县 |
博白县 |
阜南县 |
宽甸 |
泸西县 |
平湖市 |
金塔县 |
连江县 |
丹寨县 |
旅游 |
铅山县 |
专栏 |
广丰县 |
湖口县 |
太和县 |
平远县 |
从化市 |
巫溪县 |
长宁县 |