插入排序、折半插入排序Java实现

插入排序:

public class insert {
	public static void main(String[] args) {
		int a[] = {0,49,38,65,97,76,13,27,49};
		
		f(a);
		
		for (int i = 1; i < a.length; i++) {
			System.out.print(a[i]+" ");
		}
	}

	private static void f(int[] a) {
		for (int i = 2; i < a.length; ++i) {//第i趟排序
			if(a[i]<a[i-1]) {//先判断相邻的两个数大小,如果a[i]大,那么直接进入下一趟遍历,如果a[i]小,往下进行
				a[0] = a[i];//把a[i]给哨兵,留作判断
				a[i] = a[i-1];//已经知道a[i-1]小与a[i],所以a[i-1]直接后移
				int j = 0;							
				for (j = i - 2; a[0]<a[j]; --j) {//从倒数第二个数开始判断,是否需要后移
					a[j+1] = a[j];
				}
				a[j+1] = a[0];//把哨兵放在正确位置
			}
		}
	}
}

折半插入排序:

public class selfinsert {
	public static void main(String[] args) {
		int a[] = {0,49,38,65,97,76,13,27,49};
		
		f(a);
		
		for (int i = 1; i < a.length; i++) {
			System.out.print(a[i]+" ");
		}
	}

	private static void f(int[] a) {
		for (int i = 2; i < a.length; ++i) {
			a[0] = a[i];
			int low = 1;
			int height = i - 1;
			
			while(low<=height) {
				int m = (height+low)/2;
				
				if(a[m]<a[0]) low = m+1;
				else height = m-1;
			}
			
			for (int j = i-1; j > height; --j) a[j+1] = a[j];
			a[low] = a[0];
		}
	}
}

 

他们的时间复杂度和空间复杂度一样,相对于简单的插入排序,折半插入排序减少了比较的次数,移动次数并没有改变

时间复杂度:O(n^2)

空间复杂度:O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值