当前位置: 代码迷 >> Java相关 >> 直接插入排序与二分插入排序消耗时间有关问题
  详细解决方案

直接插入排序与二分插入排序消耗时间有关问题

热度:29   发布时间:2016-04-22 21:02:05.0
直接插入排序与二分插入排序消耗时间问题?
想法上来说二分要比直接插入排序速度快,可是我测试一下结果却不是这样的,希望有人指点迷津,下面上代码
直接插入排序代码:
	public static int[] insertionSort(int[] arr) {
      int i, j, newValue;
      for (i = 1; i < arr.length; i++) {// begin at the second element
            newValue = arr[i];
            j = i;
            while (j > 0 && arr[j - 1] > newValue) {
                  arr[j] = arr[j - 1];
                  j--;
            }
            arr[j] = newValue;
      }
      return arr;
}

二分插入排序代码:
	public static int[] binaryInsertSort(int[] data){
        int temp;
        int low, mid, high;
        for (int i = 1; i < data.length; i++) {
            temp = data[i];
            // 在待插入排序的序号之前进行折半插入
            low = 0;
            high = i - 1;
            while (low <= high) {
                mid = (low + high) / 2;
                if (temp < data[mid])
                    high = mid - 1;
                else
                // low=high的时候也就是找到了要插入的位置,
                // 此时进入循环中,将low加1,则就是要插入的位置了
                    low = mid + 1;
            }
            //找到了要插入的位置,从该位置一直到插入数据的位置之间数据向后移动
            for (int j = i; j >= low + 1; j--){
               data[j] = data[j - 1];
            }
            // low已经代表了要插入的位置了
            data[low] = temp;
        }
        return data;
}


测试代码:
        int[] data = new int[100000];
for(int i=0; i<=99999; i++){
data[i] = 99999-i;
}      
long begin = System.currentTimeMillis();
binaryInsertSort(data);
        long end = System.currentTimeMillis();
    System.out.println("插入用时为:" + (end - begin)+"ms");


结果:二分时候时间:插入用时为:10160ms。
          直接插入时间:插入用时为:4629ms。
我又换成1万数据,结果还是这样,换成1万内的随机数据,结果依然,二分比直接慢了一倍左右。
问了一下,有的人说是数据量太少,不足以展示二分的优势,我觉得可能是二分的时候内循环比直接插入多了(二分查找这些循环)

在这里贴出来,希望有人能解答一下,谢谢!
------解决方案--------------------
“不具有随机性”的意思是,你的数组数据已经是完全逆序的了,对于某些算法可能会走极端,因而不具备一般性。
  相关解决方案