您的位置:首页 > 编程语言 > Java开发

Java 折半插入排序

2016-03-09 18:03 543 查看
折半插入排序(二分插入排序),也是插入排序的一种,利用二分法的思想去寻找元素应该在的位置

平均时间复杂度: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();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: