比较直接插入排序和二分插入排序

直接插入排序和二分插入排序的主要区别就在元素之间判断总次数多少上


1. 直接插入排序代码:
	/*
	 *	直接插入排序。
	 * */
	public static void insertSort(int[] value,int length){
		int temp;
		for(int i=1;i<length;i++){
			temp=value[i];
			int j=i-1;
			while(j>=0&&value[j]>temp){
				insertSortCompareCount++; //计数直接插入排序一共判断了多少次。
				value[j+1]=value[j];
				j--;
			}
			value[j+1]=temp;
		}
	}
2. 二分插入排序代码:
	/*
	 *	二分插入排序。
	 * */
	public static void insertSort2(int[] value,int length){
		for(int i=1;i<length;i++){
			int left = 0;
			int right = i-1;
			int temp = value[i];
			while(left<=right){
				insertSort2CompareCount++; //计数二分插入排序共判断了多少次。
				int mid = (left+right)/2;
				if(value[mid]>temp)
					right=mid-1;
				else 
					left=mid+1;
			}
			for(int j=i-1;j>=left;j--){
				value[j+1]=value[j];
			}
			value[left]=temp;
		}
	}

直接插入排序和二分插入排序的区别在与找到待插入位置所判断的次数,所以可以比较它们比较的次数。

3. 主函数代码:
	public static void main(String[] args){
		int[] s1 = new int[size];
		for(int i=0;i<size;i++){
			s1[i]=Math.abs(rand.nextInt()%1000);
		}
		int[] s2 = Arrays.copyOf(s1,size);
		System.out.println(Arrays.toString(s1));
		
		long isTimeStart=System.nanoTime();
		insertSort(s1,s1.length);
		long isTimeEnd=System.nanoTime();

		long is2TimeStart=System.nanoTime();
		insertSort2(s2,s2.length);
		long is2TimeEnd=System.nanoTime();

		System.out.println(Arrays.toString(s1));
		System.out.println(Arrays.toString(s2));
		System.out.println("数组大小:"+size);
		System.out.println("直接插入排序判断了: "+insertSortCompareCount+"次"+"  用时:"+(isTimeEnd-isTimeStart));
		System.out.println("二分插入排序判断了: "+insertSort2CompareCount+"次"+"  用时:"+(is2TimeEnd-is2TimeStart));
	}
3. 运行结果:

1>
在这里插入图片描述
2>
在这里插入图片描述
3>
在这里插入图片描述
4>
在这里插入图片描述
5>
在这里插入图片描述
6>
在这里插入图片描述

5. 总结:

直接插入排序与二分插入排序的主要区别就在寻找待插入位置的快慢,因为对数组的移动没有太大的区别,所以这个快慢主要还是体现在判断次数上

从运行结果可以看出,大多数时候,二分插入排序判断次数,运行时间都优于直接插入排序。但也存在一些意外,如图3,4,5,虽然判断次数都优于直接插入排序,但是运行时间却比它慢,并且,通过反复运行,可以发现,这种情况主要出现在数组大小比较小的时候,在数组比较大的情况下,普遍是二分插入在判断次数,以及运行时间上都优于直接插入排序。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值