java排序演算法(七):折半插入排序,java折半
java排序演算法(七):折半插入排序
折半插入排序法又稱為二分插入排序法,是直接插入排序法的改良版本,也需要執行i-1趟插入。不同之處在於第i趟插入。先找出第i+1個元素應該插入的位置。假設前i個資料是已經處於有序狀態
代碼實現
package com.spring.test;/** * 折半插入排序 */public class BinaryInsertSort { public static void main(String[] args) { int[] data = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 }; print(data); binaryInsertSort(data); print(data); } /** * 折半插入 * @param data */ public static void binaryInsertSort(int[] data){ for(int i=1;i<data.length;i++){ if(data[i] < data[i-1]){ //緩衝i處的元素值 int tmp = data[i]; //記錄搜尋範圍的左邊界 int low = 0; int high = i-1; while(low <= high){ //記錄中間位置 int mid = (low+high)/2; //比較中間位置資料和i處資料大小,以縮小搜尋範圍 if(data[mid] < tmp){ low = mid +1; }else{ high = mid - 1; } } //將low---i處的資料整體向後移動1位 for(int j = i;j>low;j--){ data[j] = data[j-1]; } data[low] = tmp; print(data); } } } /** * 對兩個資料進行交換 * @param data * @param i * @param j */ public static void swap(int[] data,int i,int j){ if(i==j){ return ; } data[i] = data[i] + data[j]; data[j] = data[i] - data[j]; data[i] = data[i] - data[j]; } /** * 對數組進行列印輸出 * @param data */ public static void print(int[] data){ for(int i=0;i<data.length;i++){ System.out.print(data[i]+"\t"); } System.out.println(); }}
運行結果