基本思想

1.把记录按步长 gap 分组,对每组记录采用直接插入排序方法进行排序。
2.随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序。

代码实现

package com.csdhsm.sort;

/** 
 * @Title: ShellSort.java
 * @Package: com.csdhsm.sort
 * @Description 希尔排序
 * @author Han
 * @date 2016-4-3 下午5:04:01 
 * @version V1.0
 */ 
      
public class ShellSort {
    
    public void sort(int[] arr,int len){
        
        /**
         * 步长默认为长度/2
         */
        int gap = len/2;
        
        /**
         * 当步长gap为1时,结束排序
         */
        while(gap >= 1){
            
            // 把距离为 gap 的元素编为一个组,扫描所有组
            for(int i = gap;i < len;i ++){
                
                int temp = arr[i];
                int j = 0;
                
                // 对距离为 gap 的元素组进行排序
                for(j = i-gap;j >= 0 && temp < arr[j];j = j-gap){
                    
                        arr[i] = arr[j];
                }
                arr[j + gap] = temp;
            }
            //减小增量
            gap = gap / 2;
        }
    }
}

效率分析

不稳定

空间复杂度:O(1)

时间复杂度:O(nlog2n)

最坏情况:O(nlog2n)

最好情况:O()

 posted on 2016-04-03 17:21  韩思明  阅读(179)  评论(0编辑  收藏  举报