基本思想
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()