1. 程式人生 > >Java基礎練習04--折半插入排序

Java基礎練習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;
    }
}