1. 程式人生 > >java 二分插入排序演算法

java 二分插入排序演算法

 二分插入排序實現原理:
假定從小到大排序,從第二個數開始,把當前的數用一個變數temp儲存起來作為要插入的數,然後根據二分查詢原則在要插入的數前面找到需要插入的地方,然後較大的數依次往後移,將temp放在插入的地方。然後從第三個數開始如此往返迴圈將所有的數插入進去。
時間複雜度 O(nlogn)
 

public class BinaryInsertSort {
    public static void main(String[] args) {
        int[] a={49,38,65,97,176,213,227,49,78,34,12,164,11,18,1};
        System.out.println("排序之前:");
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i]+" ");
        }

        //二分插入排序
        sort(a);
        System.out.println();
        System.out.println("排序之後:");
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i]+" ");
        }
    }

    //二分法插入
    private static void sort(int[] a) {
        for (int i = 1; i < a.length; i++) {
            int temp = a[i];
            int left = 0;
            int right = i-1;
            //確定要插入的位置
            while(left<=right){
                //先獲取中間位置
                int mid = (left+right)/2;
                if(temp<a[mid]){
                    //如果值比中間值小,讓right左移到中間下標-1
                    right = mid-1;
                }else{
                    //如果值比中間值大,讓left右移到中間下標+1
                    left = mid+1;
                }
            }
            for (int j = i-1; j >= left; j--) {
                //以左下標為標準,在左位置前插入該資料,左及左後邊全部後移
                a[j+1] = a[j];
            }
            if(left != i){
                //左位置插入該資料
                a[left] = temp;
            }
        }
    }
}