首页 > 代码库 > 【数据结构与算法 00】二分插入排序

【数据结构与算法 00】二分插入排序

算法思想(从小到大排序)

  • N1:遍历数组 array[10000], i 为数组坐标,从1开始
  • N2:以 i 为基数 tmpV=array[i],[0 ,i-1] 为区间坐标,(0+i-1)/2 为 mid 坐标
  • N3:比较 tmpV 与 array[mid],如果大于,则区间为 [mid+1,i-1],否则为[0,mid-1]
  • N4:遍历所有 i 实现以上递归步骤,直到 右坐标<左坐标,因为 while 递归判断时:right>left 区间还有n个数,正常递归,当right=left=mid时,为while递归判断结束,找到结果,区间中只有最后一个数,当 right<left时,跳出while,此时 left或者 right 已被改变(为了跳出递归),但mid没有变

博客地址:http://blog.csdn.net/mkrcpp/article/details/39153951


import java.util.Arrays;

public class Main
{
	// 循环测试次数
	public static int LOOP_COUNT = 100;
	public static int ARRAY_SIZE = 10000;

	public static void main(String[] args)
	{
		int[] mArray = Common.getArray(ARRAY_SIZE);
		int allTime = 0;
		for (int i = 0; i < LOOP_COUNT; i++)
		{
			// 拷贝数组
			int[] tmpArray = Arrays.copyOf(mArray, ARRAY_SIZE);
			long tmpTime = System.currentTimeMillis();
			execute(tmpArray);
			allTime += System.currentTimeMillis() - tmpTime;
		}
		System.err.println(LOOP_COUNT + "次排序的平均耗时:" + allTime / (float) LOOP_COUNT);
	}

	/***
	 * @title 二分插入排序
	 * @description
	 * @author michael.mao
	 * @date 2014年9月5日 下午2:42:29
	 * @version V1.0
	 */
	public static void execute(int[] array)
	{
		for (int i = 1; i < array.length; i++)
		{
			int tmpV = array[i];
			int mid = 0, left = 0, right = i - 1;

			while (right >= left)
			{
				mid = (left + right) / 2;// 中
				if ( tmpV > array[mid] )
					left = mid + 1;
				else
					right = mid - 1;
			}

			// 目标(mid == left ==right)右侧(不包括目标本身)至结尾(i)右移
			for (int j = i - 1; j >= mid + 1; j--)
				array[j + 1] = array[j];
			// 目标赋值
			array[mid] = tmpV;
		}
	}

}

数组大小为(10000)的100次二分插入排序的平均耗时为:10.15 ms






【数据结构与算法 00】二分插入排序