Java-希尔排序

1. 基本概念

    基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d,
    对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序,
    当增量减到1时,进行直接插入排序后,排序完成。

2. 算法分析

    1、将包含n个元素的数组,分成n/2个数组序列,第一个数据和第n/2+1个数据为一对...
    2、对每对数据进行比较和交换,排好顺序;
    3、然后分成n/4个数组序列,再次排序;
    4、不断重复以上过程,随着序列减少并直至为1,排序完成。

3. 代码实现

public int[] sellSort(int[] arr){
    //int j;
    int temp;
    //用于记录是第几次排序
    int k = 0;
    //用于记录数据交换的位置
    int flag;
    for (int increment  = arr.length / 2; increment  > 0 ; increment /=2) {
        System.out.println("第"+(++k)+"次排序前");
        System.out.println("increment :" + increment );
        for (int i = increment; i < arr.length; i++) {
            temp = arr[i];
            flag = i;
            for (int j = i - increment; j>=0; j-=increment) {
                if(temp < arr[j]){
                    System.out.println("temp: "+temp+" arr[j]: "+arr[j]+"; j: "+j+" ");
                    arr[j+increment] = arr[j];
                    //记录数据交换的位置
                    flag = j;
                }else{
                    break;
                }
                printArr(arr);
            }
            System.out.println("flag: "+flag);
            //arr[j + increment] = temp;
            arr[flag] = temp;
            printArr(arr);
        }
        System.out.println("第"+k+"次排序后");
        printArr(arr);
        System.out.println();
    }
    return arr;
}

4. 测试

@Test
public void test(){
    int arr[] = {6,3,8,2,9,1};
    System.out.println("排序前");
    printArr(arr);
    int[] data = sellSort(arr);
    System.out.println("排序后");
    printArr(data);
}

public void printArr(int[] arr){
    for (int i = 0; i < arr.length; i++) {
        System.out.print(arr[i]+" ");
    }
    System.out.println();
}

5. 总结

    希尔排序的关键并不是随便分组后各自排序,而是将相隔某个“增量”的记录组成一个子序列,实现跳跃式移动,
    使得排序的效率提高。需要注意的是,增量序列的最后一个增量值必须等于1才行。另外,由于记录是跳跃式的移动,
    希尔排序并不是一种稳定的排序算法。 

猜你喜欢

转载自blog.csdn.net/rjgcszlc/article/details/79760917
今日推荐