Java 折半插入排序

折半插入排序(二分插入排序),也是插入排序的一种,利用二分法的思想去寻找元素应该在的位置

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

 最好时间复杂度:O(nlgn)   // 数组完全有序

 最坏时间复杂度:O(n^2)   // 数组完全逆序 

 空间复杂度:O(1) 

 算法稳定性:稳定


上代码:

public class 二分法插入排序 {

	private static int[] data;

	/**
	 * 把data数组从小到大进行排序
	 */
	public static void Sort() {

		for (int i = 1; i < data.length; i++) { // 每次循环都是查找 data[i]这个int值 应该在的位置
			// 循环开始 定义查找的范围 (0,i-1),之所以end为 i-1 ,因为当前需要寻找位置的数是 i,范围从它前面开始
			int start = 0, end = i - 1, mid;
			int key = data[i];
			while (start <= end) { // 这个循环目的是查找data[i]应该在的位置
				// 循环结束的end一定是大于start 怎么去证明呢?
				// 假设最后一个mid大于key,那么end前移,所以最后一个mid就是key所在的位置,final position =
				// end +`1
				// 假设最后一个mid小于key,那么start后移,最后一个mid之前的位置就是final position= end +
				// 1
				// 则最后放置位置是 end+1
				mid = (start + end) / 2;
				if (data[mid] > key) { // 小于中点值,则后面指针前移
					end = mid - 1;
				} else { // 大于中点值,则前面指针后移
					start = mid + 1;
				}
			}
			// 由于final position前面数组已经有序,所以所以把final position及其之后的元素后移
			for (int j = i - 1; j >= end + 1; j--) {
				data[j + 1] = data[j]; // 之前的范围最后一位是 i-1,所以i-1+1的位置等于i-1,依次类推
			}
			data[end + 1] = key;
		}

	}

	/**
	 * 
	 * 用增强for循环输出当前数组
	 */
	public static void PrintData() {
		for (int i : data) {
			System.out.print(" " + i);
		}
		System.out.println("");
	}

	public static void main(String[] args) {
		data = new int[10];
		System.out.println("输入十个数 进行直接插入排序");
		Scanner scanner = new Scanner(System.in);
		for (int i = 0; i < 10; i++) {
			data[i] = scanner.nextInt();
		}
		Sort();
		PrintData();
		scanner.close();
	}

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章