《算法 第四版》算法5--希尔排序的实现

希尔排序

-自然语言描述:

先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量 d t = 1(dt < dt-1…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝最终位置前进一大步。然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需排序的数据几乎是已排好的了(此时插入排序较快)。

-Java语言实现:

  public static void sort(Comparable[] a){
    int N = a.length;
    int h = 1;
    while (h < N/3) h = 3*h + 1;
    while (h >= 1){
        for(int i = h; i < N; i++){
            for(int j = i; j>=h&&(a[j] <a[j-1]);j -=h){
                Comparable temp = a[j];
                a[j] = a[j-1];
                a[j-1] = temp; 
          }
      }
   h = h/3;
    }
  }

-验证代码:

  public class Shell {
    public static void sort(Comparable[] a){
        //升序
        int N = a.length;
        int h = 1;
        while (h < N/3) h = 3*h + 1;
        while (h >=1 ){
            for (int i = h; i < N; i++ ) {
                for (int j = i; j >=h&&less(a[j], a[j - h]);j-=h) {
                    exch(a,j,j-h);
                }
            }
            h = h/3;
        }
}
private static boolean less(Comparable v, Comparable w){ return v.compareTo(w) < 0; }


private static void exch(Comparable[] a, int i, int j){ 
    Comparable t = a[i]; a[i] = a[j]; a[j] = t; }
    private static void show(Comparable[] a){ // 在单行中打印数组
        for (int i = 0; i < a.length; i++)
        System.out.print(a[i] + " ");
        System.out.println();
    }

    public static boolean isSorted(Comparable[] a){
        int length = a.length;
        for (int i = 1;i < length ;i++ ) {
            if (less(a[i],a[i -1])) {
                return false;
            }
        }
        return true;
    }


    public static void main(String[] args) {
        String[] a = In.readStrings();
        sort(a);
        assert isSorted(a);
        show(a);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这是我以前写的博客,我迁移过来的,时间写的有点久远 1.冒泡排序和选择排序 为什么把冒泡排序和选择排序放在一块儿呢...
    ianCure阅读 2,315评论 3 19
  • 总结一下常见的排序算法。 排序分内排序和外排序。内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序...
    jiangliang阅读 1,376评论 0 1
  • 第一章 常规排序算法 第一章 常规排序算法一、排序的基本概念排序内部排序与外部排序排序的稳定性二、冒泡排序算法思想...
    白老师课堂阅读 1,018评论 2 12
  • 概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的...
    Luc_阅读 2,300评论 0 35
  • 排序的分类可以分为两种:内排序和外排序。 在排序过程中,全部记录放在内存,则称为内排序,如果排序过程中要使用外村,...
    親愛的破小孩阅读 1,139评论 0 1