折半插入排序


基本思想

    考慮到 L.r[1..i-1] 是按關鍵字有序的有序序列,則可以利用折半查找實現“ L.r[1…i-1]中查找 L.r[i] 的插入位置”如此實現的插入排序為折半插入排序。折半插入排序在尋找插入位置時,不是逐個比較而是利用折半查找的原理尋找插入位置。待排序元素越多,改進效果越明顯。


[java]  view plain  copy
  1. package sort.insertionSort;  
  2.   
  3. public class BinaryInsertionSort {  
  4.   
  5.     /** 
  6.      * @param args 
  7.      */  
  8.     //對順序表L做折半插入排序,利用折半查找快速找到要插入的位置  
  9.     public static void binaryInsertSort(int[] L){  
  10.         for(int i = 2; i <= L.length-1; i++){          
  11.             //利用折半查找找到要插入的位置  
  12.             int low = 1, high = i-1;//在1->i-1的有序子序列中插入第i個元素,使之成為1->i的有序子序列  
  13.             L[0] = L[i];//暫存要插入的元素  
  14.             while(low <= high){  
  15.                 int mid = (low+high)/2;  
  16.                 if(L[0] < L[mid])  
  17.                     high = mid -1;  
  18.                 else  
  19.                     //L[0] >= L[mid]  
  20.                     low = mid+1;//等於當成大於處理,這樣后出現的相等值就會排在后面,從而到達“穩定”  
  21.             }  
  22.             //此時high = low-1,且high+1即low的位置即為要插入的位置  
  23.             for(int j = i-1; j >= low; j--)  
  24.                 L[j+1] = L[j];  
  25.             L[low] = L[0];  
  26.         }  
  27.     }  
  28.     public static void main(String[] args) {  
  29.         // TODO Auto-generated method stub  
  30.         int[] test = {0532736156942}; //0號單元未使用  
  31.         binaryInsertSort(test);  
  32.         for(int i = 1; i <= test.length-1; i++)  
  33.             System.out.print(test[i]+" ");  
  34.     }  
  35. }  
運行結果:

    折半插入排序減少了關鍵字的比較次數,但記錄的移動次數不變,其時間復雜度與直接插入排序相同,時間復雜度為O(n^2) 。折半插入排序是“穩定的”。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: