排序7:希尔排序

 http://blog.csdn.net/qq_27703417/article/details/70952849

 

希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

 

 

import java.util.*;  
//希尔排序,对步长feet进行循环或者递归地缩短,直到收敛为步长为1的直接插入排序  
public class ShellSort{  
    public int[] shellSort(int[] A, int n) {  
        // 特殊输入  
        if (A == null || A.length <= 0)  
            return A;  
        // 调用递归方法(尾递归)sort()来完成希尔排序  
        //注意习惯,题目中的数组通常以A给出,而自己喜欢用array表示数组,因此在调用函数时要记住传入的是A  
        sort(A, A.length >> 1);  
        // 记得要返回排序后的结果  
        return A;  
    }  
    // 写一个排序方法sort(array,feet)用来使用步长feet对数组进行插入排序,内部调用的方法最好写成private方法  
    private void sort(int[] array, int feet) {  
        // 递归一定要有停止递归的边间条件  
        if (feet <= 0)  
            return;  
        // 按照步长feet对数组array进行插入排序  
        // 初始位置为i=feet;初始的比较位置是index=index-feet  
        for (int i = feet; i < array.length; i++) {  
// 要与前一个元素进行比较需要设置一个指针index,总是比较2个相邻的元素array[index]和array[index-feet],第一个元素是array[i]  
            int index = i;  
        // 如果index-feet<0说明index不要再往前交换了,本元素已经找到了合适的位置,停止循环  
            while (index - feet >= 0) {  
                if (array[index] < array[index - feet]) {  
                    // 如果后一个元素比前一个元素要小,应该交换元素  
                    this.swap(array, index, index - feet);  
                    index -= feet;  
                } else {  
// 注意,还要有else,如果后面的元素大于等于前面的元素,不需要交换,说明元素array[index]之前已经找到合适的位置于是不需要再往前遍历了,结束本元素array[i]的插入,开始下一个i的向前插入  
                    break;  
                }  
            }  
        }  
// 本步长的插入结束,此时需要更换步长feet,再次进行插入,于是递归调用sort()传入新的步长即可  
        this.sort(array, feet >> 1);  
    }  
    // 写一个辅助函数用来交换2个元素  
    private void swap(int[] array, int p1, int p2) {  
        int temp = array[p1];  
        array[p1] = array[p2];  
        array[p2] = temp;  
    }  
}  

  

posted on 2017-08-22 16:19  zhangxiaoyu  阅读(158)  评论(0)    收藏  举报

导航