zoukankan      html  css  js  c++  java
  • java实现插入排序

      插入排序是一种通过不断地把新元素插入到已排好序的数据中的排序算法,常用的插入排序算法包括直接插入排序和shell排序,直接插入排序实现比较简单,时间复杂度是O(n),但是直接插入没有充分的利用已插入的数据已经排序这个事实,因此有很多针对直接插入排序改进的算法,例如折半插入排序等,下边是直接插入排序的Java实现:

    public static void insertSort(int[] elements){
    		for(int i = 1;i <elements.length; i++){
    			int j = -1;
    			while(j <= i && elements[i] > elements[++j]);//找到element[i]应该摆放的位置,此处可以利用查找算法进行优化
    			if(j < i){
    				//将j之后的数据移动一位,然后把elements[i]移动到j处
    				int temp = elements[i];
    				for(int k = i-1;k >= j;k--){
    					elements[k+1] = elements[k];
    				}
    				elements[j] = temp;
    			}
    		}
    }
    

      另一种常用的插入排序算法:Shell排序也是对直接插入排序算法的一种优化,因此可以说直接插入排序是一种特殊的Shell排序,Shell排序对直接插入排序的优化主要体现在,Shell排序通过使用一个增量序列(递减),每次把要排序的数组分成几个子数组,然后对子数组进行插入排序,这样可以减少比较和移动数据的次数,Shell排序是一种非常高效的排序算法,该算法的思想是:
      1.以h(h一般取n/2)为间隔将n个元素列分为几个小组,在每个小组内按直接插入法排序
      2.令h=h/2,重复第1步
      3.当h=1时,排序结束(此时相当于直接插入排序,不过由于数据已经基本排好序,因此比较次数和移动次数比直接插入排序少很多)
      Shell排序的Java实现如下:

    public static void shellSort(int[] elements){
    		for(int h = elements.length/2;h > 0;h /= 2){
    			
    			for(int i = h;i < elements.length; i++){
    				int j = i % h;
    				while(j <= i && elements[i] > elements[j]) j += h;//找到element[i]应该摆放的位置
    				if(j < i){
    					//将j之后的数据移动h位,然后把elements[i]移动到j处
    					int temp = elements[i];
    					for(int k = i-h;k >= j;k -= h){
    						elements[k+h] = elements[k];
    					}
    					elements[j] = temp;
    				}
    			}
    			
    		}
    }
    

  • 相关阅读:
    HTML中为何P标签内不可包含块元素?
    js判断鼠标位置是否在某个div中
    拒绝图片延迟加载,爽爽的看美图
    PHP为什么会被认为是草根语言?
    宜信开源微服务任务调度平台(SIA-TASK)
    JSBridge框架解决通信问题实现移动端跨平台开发
    如何运用多阶构建编写优雅的Dockerfile
    Sharding-JDBC 使用入门和基本配置
    程序员笔记|详解Eureka 缓存机制
    程序员笔记|常见的Spring异常分析及处理
  • 原文地址:https://www.cnblogs.com/sunzhenxing19860608/p/1982449.html
Copyright © 2011-2022 走看看