算法相关——Java排序算法之希尔排序(五)

0. 前言java

本系列文章将介绍一些经常使用的排序算法。排序是一个很是常见的应用场景,也是开发岗位面试必问的一道面试题,有人说,若是一个企业招聘开发人员的题目中没有排序算法题,那说明这个企业不是一个正规的企业,哈哈,虽然有点戏谑,可是也从侧面证实了排序算法的重要性。面试

本文将介绍的是常见排序算法中的希尔排序算法


希尔排序性能

5.1  基本思想优化

希尔排序是对插入排序的一个改进,希尔排序首先把待排数列按照必定增量进行分割,好比{3,1,5,9,6,5,0,2,4,12}数列,咱们首先设置增量为n/2=5,所以有了分块后5个子块,即{3,5},{1,0},{5,2},{9,4},{6,12}将每一个子块进行插入排序(即第i位与第i+5位进行比较交换),初步排序结果为{3,0,2,4,6,5,1,5,9,12}。希尔排序再将增量逐渐减少,进行5/2=2的分块,即{3,2,6,1,9},{0,4,5,5,12},同理插入排序得{1,0,2,4,3,5,6,5,9,12},最终进行2/2=1分块,即对上数列直接进行插入排序获得最终序列{0,1,2,3,4,5,5,6,9,12}this


5.2  代码实现spa

/*
*@author Calvin
*@blog  http://blog.csdn.net/seu_calvin/article/details/56879397
*@date 2017/02/24
*/

public class Order {
	private int[] array; 
	public Order(int[] array){
            this.array = array;
	}
	
    public void sort() {
       if(array!=null && array.length>0){
    	    //增量递减
    	   	for(int k = array.length/2; k>0; k/=2){
    	   		for(int i = k; i<array.length ; i++){	   			
    	   			for(int j = i; j>=k; j-=k){
        	   			if(array[j-k] > array[j]){
        	   				int temp = array[j-k];
        	   				array[j-k] = array[j];
        	   				array[j] = temp;
        	   			}
    	   			}
    	   		}
    	   	}
       }
    } 
    
    public void print() {  
        for(int i = 0; i < array.length; i++)
     	  System.out.println(array[i]);
    }  
      
    public static void main(String[] args) {  
        int[] array = new int[]{3,1,5,9,6,5,0,2,4,12}; 
        Order order = new Order(array); 
        order.sort();
        order.print();
    }  
  }
输出结果略。


5.3  性能特色.net

希尔排序是对插入排序的优化,希尔排序因为增量初始值以及增量每次如何递减的方式不必定,所以时间复杂度也不肯定。若是每次都除2,则最坏的状况和直接插入排序的时间复杂度同样是O(n*n),可是通常认为希尔排序的复杂度为O(n^1.3)空间复杂度为O(1),希尔排序是不稳定的算法,由于一样的值若不在一个组内,可能后面的值会被移动到前面。code

希尔排序须要选择合适的增量序列,这是比较复杂的,所以希尔排序重在优化思路,现实中比较少用。blog

相关文章
相关标签/搜索