1. 程式人生 > >五十道程式設計小題目 --- 28 八大排序演算法 java 之 01直接插入排序

五十道程式設計小題目 --- 28 八大排序演算法 java 之 01直接插入排序

1.插入排序—直接插入排序(Straight Insertion Sort)

基本思想:

將一個記錄插入到已排序好的有序表中,從而得到一個新,記錄數增1的有序表。即:先將序列的第1個記錄看成是一個有序的子序列,然後從第2個記錄逐個進行插入,直至整個序列有序為止。

要點:設立哨兵,作為臨時儲存和判斷陣列邊界之用。

直接插入排序示例:


如果碰見一個和插入元素相等的,那麼插入元素把想插入的元素放在相等元素的後面。所以,相等元素的前後順序沒有改變,從原無序序列出去的順序就是排好序後的順序,所以插入排序是穩定的。

演算法的實現:

[java] view plain copy  
print
?在CODE上檢視程式碼片派生到我的程式碼片
  1. publicclass StraihtInertionSort {  
  2.     //快速排序演算法
  3.     publicstaticint[] sort(int[] arr){  
  4.         int n = arr.length;  
  5.         for(int i=0; i<n-1 ; i++){  
  6.             if(arr[i] > arr[i+1]){  
  7.                 //交換
  8.                 int tmp = arr[i];  
  9.                 arr[i] = arr[i+1];  
  10.                 arr[i+1
    ] = tmp;  
  11.                 int index = i;  //由於上面的交換,arr[i] < arr[i+1]的 , 所以index儲存的是即將要與前面所有數比較的索引即監視哨
  12.                 int j=i-1;  
  13.                 while( j>=0 && arr[j] > arr[index] ){  
  14.                     //交換
  15.                     int tmp1 = arr[j];  
  16.                     arr[j] = arr[index];  
  17.                     arr[index] = tmp1;  
  18.                     index = j;  
  19.                     j--;  
  20.                 }  
  21.             }  
  22.         }  
  23.         return arr;  
  24.     }  
  25.     //列印陣列
  26.     publicstaticvoid print(int[] arr){  
  27.         for(int i=0; i<arr.length ; i++){  
  28.             System.out.print(arr[i] + " ");  
  29.         }  
  30.         System.out.println();  
  31.     }  
  32.     publicstaticvoid main(String[] args) {  
  33.         int[] arr = {49,38,65,97,76,13,27,49};  
  34.         print(arr);  
  35.         print(sort(arr));  
  36.     }  
  37. }  
輸出結果: [java] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. 4938659776132749
  2. 1327384949657697

效率:

時間複雜度:O(n^2).