Java算法-希尔排序

希尔排序

 

思想:

在直接插入排序算法中,每次插入一个数,使有序序列只增加1个节点,并且对插入下一个数没有提供任何帮助。如果比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除多个元素交换。D.L.shell于1959年在以他名字命名的排序算法中实现了这一思想。算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。

 

更多信息:http://baike.baidu.com/view/1110250.htm

 

代码:

    public static void main(String[] args) {
        int[] i = {1001,596,403,39,23,12,9,6,5,4,3,1};
        shellSort(i);
    }

    private static void show(int[] x) {
        for (int i:x) {
            System.out.print(i + " ");
        }
        System.out.println();
    }

    // 希尔排序
    public static void shellSort(int[] x) {
        show(x);
        int n = 1;
        // 分组
        for (int increment = x.length / 2;increment > 0;increment /= 2) {
            System.out.println("----------Round " + n++ + "-----------");
            // 每个组内排序
            for (int i = increment;i < x.length;i++) {
                int temp = x[i];
                int j = 0;
                for (j = i;j >= increment;j -= increment) {
                    if (temp < x[j - increment]) {
                        x[j] = x[j - increment];
                    } else {
                        break;
                    }
                }
                x[j] = temp;
                show(x);
            }
        }
        show(x);
    }

 

 

结果:

1001 596 403 39 23 12 9 6 5 4 3 1 
----------Round 1-----------
9 596 403 39 23 12 1001 6 5 4 3 1 
9 6 403 39 23 12 1001 596 5 4 3 1 
9 6 5 39 23 12 1001 596 403 4 3 1 
9 6 5 4 23 12 1001 596 403 39 3 1 
9 6 5 4 3 12 1001 596 403 39 23 1 
9 6 5 4 3 1 1001 596 403 39 23 12 
----------Round 2-----------
4 6 5 9 3 1 1001 596 403 39 23 12 
4 3 5 9 6 1 1001 596 403 39 23 12 
4 3 1 9 6 5 1001 596 403 39 23 12 
4 3 1 9 6 5 1001 596 403 39 23 12 
4 3 1 9 6 5 1001 596 403 39 23 12 
4 3 1 9 6 5 1001 596 403 39 23 12 
4 3 1 9 6 5 39 596 403 1001 23 12 
4 3 1 9 6 5 39 23 403 1001 596 12 
4 3 1 9 6 5 39 23 12 1001 596 403 
----------Round 3-----------
3 4 1 9 6 5 39 23 12 1001 596 403 
1 3 4 9 6 5 39 23 12 1001 596 403 
1 3 4 9 6 5 39 23 12 1001 596 403 
1 3 4 6 9 5 39 23 12 1001 596 403 
1 3 4 5 6 9 39 23 12 1001 596 403 
1 3 4 5 6 9 39 23 12 1001 596 403 
1 3 4 5 6 9 23 39 12 1001 596 403 
1 3 4 5 6 9 12 23 39 1001 596 403 
1 3 4 5 6 9 12 23 39 1001 596 403 
1 3 4 5 6 9 12 23 39 596 1001 403 
1 3 4 5 6 9 12 23 39 403 596 1001 
1 3 4 5 6 9 12 23 39 403 596 1001 

 

 

 

 

你可能感兴趣的:(java算法)