基础算法练习04--折半插入排序

      折半插入排序相比直接插入排序,时间复杂度并没有改变。但是,折半插入排序减少了元素比较的次数。基本的操作就是:通过折半查找,找到有序序列中要插入的位置。从这个位置开始往后,有序序列的所有元素向后移动一位,将需要插入的元素放入这个位置。

 

代码:

package cn.drc.sort.insertsort;

import java.util.Arrays;

/**
 * 折半插入排序
 * @author drc
 *
 */
public class HalfInsertSortDemo {
    public static void main(String[] args) {
	int[] arr = {4,8,6,45,3,68,64,5,34,36,0,42,48,9,
	    41,1,2,89,34,10,63,7,48,96,51,20,74};
	halfInsertSort(arr);
	System.out.println(Arrays.toString(arr));
    }
	
    static int[] halfInsertSort(int[] arr) {
	// 有序序列的初始长度为1
	int orderLength = 1;
        // 既然要进行折半的操作,那么就需要有序序列头和尾
        int start, end, mid;
	while (orderLength < arr.length) {
	    // 纪录需要插入的元素
	    int toInsert = arr[orderLength];
	    start = 0;
	    end = orderLength - 1;
		
	    mid = 0;
	    while (start<=end) {
		// 每次要加入一个元素的时候,都需要将有序序列进行折半,和要插入的元素进行比较
		mid = (start+end)/2;
		
		if (arr[(start+end)/2] > toInsert) { // 要插入的位置在低半区
		    end = mid-1;
		} else { // 要插入的位置在高半区
		    start = mid+1;
		}
            }
			
	    for (int x=orderLength; x>start; x--) {
	        // 从插入位置开始所有元素后移
	        arr[x] = arr[x-1];
	    }
	    // 插入
	    arr[start] = toInsert;
	    // 有序序列长度自增1
	    orderLength++;
        }
    return arr;
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值