Java 折半插入排序
2016-03-09 18:03
543 查看
折半插入排序(二分插入排序),也是插入排序的一种,利用二分法的思想去寻找元素应该在的位置
平均时间复杂度:O(n^2)
最好时间复杂度:O(nlgn) // 数组完全有序
最坏时间复杂度:O(n^2) // 数组完全逆序
空间复杂度:O(1)
算法稳定性:稳定
上代码:
平均时间复杂度: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(); } }
相关文章推荐
- java学习之文件的读取
- java转换xml、list、map和json
- java转换xml、list、map和json
- 2016蓝桥杯假期任务之《兰顿蚂蚁》
- java学习之文件的删除
- jersey spring shiro mybatis mysql集成配置
- 如何在Eclipse中嵌入外部工具
- Eclipse项目导入到Android Studio(不用Eclipse导出时生成gradle)
- Java 变量初始化
- Struts2配置--Action配置
- 聊聊并发(三)Java线程池的分析和使用
- 将WEB工程转换为Maven工程(eclipse)
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
- 【Spring】Spring注解注入
- 常用eclipse快捷键
- 【Spring】Spring 依赖注入方式
- java 中使用lo4j2
- springmvc学习笔记(6)-springmvc整合mybatis(IDEA中通过maven构建)
- SpringMVC+Spring+Mybatis+Maven+mysql整合
- 【Spring】Spring依赖注入与控制反转理解