Java基礎練習04--折半插入排序
阿新 • • 發佈:2018-12-04
折半插入排序相比直接插入排序,時間複雜度並沒有改變。但是,折半插入排序減少了元素比較的次數。基本的操作就是:通過折半查詢,找到有序序列中要插入的位置。從這個位置開始往後,有序序列的所有元素向後移動一位,將需要插入的元素放入這個位置。
程式碼:
package cn.drc.sort.insertsort; import java.util.Arrays; /** * 折半插入排序 * @author drc * */ public class HalfInsertSortDemo { public static void main(String[] args) { int[] arr = {4,8,6,45,3,68,64,5,34,36,0,42,48,9, 41,1,2,89,34,10,63,7,48,96,51,20,74}; halfInsertSort(arr); System.out.println(Arrays.toString(arr)); } static int[] halfInsertSort(int[] arr) { // 有序序列的初始長度為1 int orderLength = 1; while (orderLength < arr.length) { // 紀錄需要插入的元素 int toInsert = arr[orderLength]; // 既然要進行折半的操作,那麼就需要有序序列頭和尾 int start = 0; int end = orderLength - 1; int mid = 0; while (start<=end) { // 每次要加入一個元素的時候,都需要將有序序列進行折半,和要插入的元素進行比較 mid = (start+end)/2; if (arr[(start+end)/2] > toInsert) { // 要插入的位置在低半區 end = mid-1; } else { // 要插入的位置在高半區 start = mid+1; } } for (int x=orderLength; x>start; x--) { // 從插入位置開始所有元素後移 arr[x] = arr[x-1]; } // 插入 arr[start] = toInsert; // 有序序列長度自增1 orderLength++; } return arr; } }