0. 前言java
本系列文章将介绍一些经常使用的排序算法。排序是一个很是常见的应用场景,也是开发岗位面试必问的一道面试题,有人说,若是一个企业招聘开发人员的题目中没有排序算法题,那说明这个企业不是一个“正规”的企业,哈哈,虽然有点戏谑,可是也从侧面证实了排序算法的重要性。面试
本文将介绍的是常见排序算法中的希尔排序。算法
5 希尔排序性能
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