内部排序算法系列---拆半插入排序

拆半插入排序是对直接插入排序的简单改进,对于直接插入排序而言,当第i-1趟需要将第i个元素插入前面的0~i-1个元素序列中,它总是从i-1个元素开始,逐个比较每个元素,知道找到它的位置。这显然没有利用前面0~i-1个元素已经有序的特点,而拆半插入排序则改进这一点。

import java.util.Arrays;

/**
 * @author stefanie zhao
 * @date 2014-10-11 上午11:05:53
 */
public class BinaryInsertSort {

    public static void main(String[] args) {
        DataWrap[] data = { new DataWrap(23, ""), new DataWrap(13, ""), new DataWrap(43, ""), new DataWrap(9, ""),
                new DataWrap(3, ""), new DataWrap(34, "") };
        System.out.println("before sort: \n" + Arrays.toString(data));
        binaryInsertSort(data);
        System.out.println("after sort: \n" + Arrays.toString(data));
    }

    public static void binaryInsertSort(DataWrap[] data) {
        System.out.println("begin  sort....");
        int arrayLength = data.length;
        for (int i = 1; i < arrayLength; i++) {
            DataWrap tmp = data[i];
            int low = 0;
            int high = i - 1;
            while (low <= high) {
                int mid = (low + high) / 2;
                if (tmp.compareTo(data[mid]) > 0) {
                    low = mid + 1;
                } else {
                    high = mid - 1;
                }
            }
            // 将low到i处的所有元素向后整体移动一位
            for (int j = i; j > low; j--) {
                data[j] = data[j - 1];
            }
            // 最后将tmp的值插入合适位置
            data[low] = tmp;
            System.out.println(Arrays.toString(data));
        }
    }

}

执行结果:

before sort:
[23, 13, 43, 9, 3, 34]
begin  sort....
[13, 23, 43, 9, 3, 34]
[13, 23, 43, 9, 3, 34]
[9, 13, 23, 43, 3, 34]
[3, 9, 13, 23, 43, 34]
[3, 9, 13, 23, 34, 43]
after sort:
[3, 9, 13, 23, 34, 43]

上面的程序的排序效果和直接插入排序的效果是基本相同的,只是更快了些,因为拆半插入排序可以更快的确定第i个元素的插入位置。

你可能感兴趣的:(插入排序,拆半插入排序)