二分插入排序算法

	public static void main(String args[]){
		int a[] ={0,9,5,6,10,2,7,8};
//		directInsertSort(a);
		binaryInsertSort(a);

	}
	
	//打印当前数组的内容
	public static void printArray(String text,int []a){
		System.out.print(text);
		int n = a.length;
		//遍历数组当中的内容
		for(int i=0;i<n-1;i++){
			System.out.print(a[i]+",");	
		}
		System.out.println(a[n-1]);
		
	}<pre class="java" name="code">//二分插入排序
	//与直接插入排序算法类似,不同之处在于确定好插入的位置之后,一次性地将数据往后移动。
	public static void binaryInsertSort(int []a){
		
		//数组的长度
		int n = a.length;
		for(int i=2;i<n;i++){
			printArray("当前的数据为:", a);
			
			//如果有序的最后一位大于要排序的一位,将其加入标记位a[0]
			if(a[i-1]>a[i]){
				a[0] = a[i];
				printArray("将第"+i+"位放入标记位:",a);
				
				//用二分方式查找要插入的位置(将有序的队列的中间值与要插入的数据比较。如果大,则继续从中间值的右边继续二分查找;如果小,则从中间值的左边开始(相等的情况应该默认为大),以此类推)
				int low = 1;
				int high = i-1;
				
				
				while(high>=low){
					int mid = (low + high)/2;
					//如果插入数据比中间值大
					if(a[0]>=a[mid]){
						low = mid+1;
					}else
						high = mid-1;
				}
				
				printArray("用二分法查找到插入数据的位置为"+(high+1)+":",a);
				
				//跳出循环之后,要插入的位置为high+1(如果不明白的话自己可以尝试一下,假如最后a[0]判断为在a[3]和a[4]之间,这时low=3,mid=3,high=4)
				//假如a[0]<a[3],则进入else,low=3,mid=3,high=2,跳出循环,要插入数据位置为3
				//假如a[3]<a[0]<a[4],则进入if,low=4,mid=3,high=4,进入else,low=4,mid=4,high=3,跳出循环,要插入数据位置为4
				//假如a[4]<a[0],则进入if,low=4,mid=3,high=4,进入if,low=5,mid=4,high=4,跳出循环,要插入的位置为5
				int j;
				for( j = i-1; j>=high+1;j--){//向后移动数据
					a[j+1] = a[j];
				}
				a[j+1] = a[0];
				printArray("插入数据后的结果为:",a);	
			}
		}
		
	}

 

输出结果为:

不明白的地方可以查看直接插入排序算法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值