Java实现插入排序

Cr:排序中的一类——插入排序


/**
 * 升序排序——插入排序
 * @author Aegis
 *
 */
public class Sort {
	
	//需要排序的数组,包含一个等于情况"6"
	private int[] intArray = {9,17,5,6,4,2,1,6,8,7,11,13,14,3,10};
	
	/**
	 * 直接插入排序
	 * @param args
	 */
	public void directInsertSort(){
		for(int i=1; i<intArray.length; i++){
			int temp = intArray[i];
			int j;
			for(j=i-1; j>=0&&intArray[j]>temp; j--){ //从有序部分的最后一位往前比较
					intArray[j+1] = intArray[j]; //j位子空出
			}
			intArray[j+1] = temp; //之前有j--,所以+1
		}
		System.out.println("直接插入排序");
		for(int i=0; i<intArray.length; i++)
			System.out.println(intArray[i]);
	}
	
	/**
	 * 二分插入排序
	 * 采用二分查找方法寻找插入位置
	 * @param args
	 */
	public void binaryInsertSort(){
		for(int i=1; i<intArray.length; i++){
			int temp = intArray[i]; //记录要插入的数据
			int low = 0; //设置有序部分的初始区间
			int high = i-1;
			int mid;
			while(low <= high){
				mid = (low+high)/2;
				if(intArray[i]>intArray[mid])
					low = mid+1; //插入位置在后半部分
				else 
					high = mid -1; //插入位置在前半部分,包括等于的情况
			}
			
			for(int j=i-1; j>=high+1; j--){ //向后移动数据
				intArray[j+1] = intArray[j]; //j是空出来的位子
			}
			intArray[high+1] = temp; //记录插入正确位置		
		}
		System.out.println("二分插入排序");
		for(int i=0; i<intArray.length; i++)
			System.out.println(intArray[i]);
	}
	
	/**
	 * 希尔排序
	 * @param args
	 */
	public void shellInsertSort(){
		int d[] = {5,3,1}; //步长序列
		for(int k=0; k<d.length; k++){
			int dk = d[k];
			for(int i=dk; i<intArray.length; i++){ //dk是第1子队列的第二个元素,i表示第i个队列
				int temp = intArray[i];
				int j;
				for(j=i-dk; j>=0&&intArray[j]>temp; j=j-dk){
					intArray[j+dk] = intArray[j];
				}
				intArray[j+dk] = temp;
			}
		}
		System.out.println("希尔排序");
		for(int i=0; i<intArray.length; i++)
			System.out.println(intArray[i]);
	}
	
	public static void main(String[] args) {
		Sort directInsertSort = new Sort();
		directInsertSort.directInsertSort();
		System.out.println();
		
		Sort binaryInsertSort = new Sort();
		binaryInsertSort.binaryInsertSort();
		System.out.println();
		
		Sort shellInsertSort = new Sort();
		shellInsertSort.shellInsertSort();
		System.out.println();
	}

}

打印结果:(其他两个同,由于是竖着打印就没有贴上来)

直接插入排序 
1
2
3
4
5
6
6
7
8
9
10
11
13
14
17

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值