插入排序 Java版

package application;

public class Study {
	public static void main(String[] args) {
		//从小到大
		int[] a = {0,2,4,3,9,6,10,7,1,8,5};
		int[] b = sort2(a);
		System.out.print("排序结果:\n");
		for(int i = 0;i < b.length;i++){
			System.out.print(b[i] + " ");
		}
		
	}
	
	//直接插入排序
	private static int[] sort1(int[] a){
		//第一个之外的排序
		//a[0]是哨兵,临时存储待插入值,a[1]至a[n]排序
		System.out.print("排序开始------(第一个是哨兵):\n");
		for(int i = 2;i <= a.length - 1;i++){
			if(a[i - 1] > a[i]){//需插入的满足条件,前一个大于后一个
				a[0] = a[i];//存储哨兵
				a[i] = a[i - 1];//将前面的后移
				int j;
				for(j = i - 2;a[j] > a[0];j--){//继续向前比较,看是否需将前面的后移
					a[j + 1] = a[j];
				}
				
				//a[j]没有哨兵a[0]大,可以将带插入值插入了
				a[j + 1] = a[0];
			}					
						
			for(int m = 0;m < a.length;m++){
				System.out.print(a[m] + " ");
			}
			System.out.print("\n");
		}
		System.out.print("排序结束------(第一个是最后一个哨兵):\n");
		return a;
	}
	
	//折半插入排序
	private static int[] sort2(int[] a){
		//第一个之外的排序
		//a[0]是哨兵,临时存储待插入值,a[1]至a[n]排序
		System.out.print("排序开始------(第一个是哨兵):\n");
		for(int i = 2;i <= a.length - 1;i++){
			if(a[i - 1] > a[i]){//需插入的满足条件,前一个大于后一个
				a[0] = a[i];//存储哨兵
				a[i] = a[i - 1];//将前面的后移
				int low = 1,high = i - 1;//将a[i]在a[1]至a[i - 1]通过折半查找方式插入
				int mid;
				while(low <= high){
					mid = (low + high)/2;//向下取整
					if(a[mid] > a[0]){//a[i]应该在a[low]至a[mid - 1]之间插入
						high = mid - 1;
					}else{
						low = mid + 1;//a[i]应该在a[mid + 1]至a[high]之间插入
					}
					
				}
				//此时low > high
				//high + 1是待插入值应插入的位置
				for(int j = i - 2;j >= high + 1;j--){
					a[j + 1] = a[j];
				}
				
				a[high + 1] = a[0];
			}
			
			for(int m = 0;m < a.length;m++){
				System.out.print(a[m] + " ");
			}
			System.out.print("\n");
		}
		
		System.out.print("排序结束------(第一个是最后一个哨兵):\n");
		return a;
	}
	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风铃峰顶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值