zoukankan      html  css  js  c++  java
  • 高级排序之希尔排序

      希尔排序对于多达几千个数据项的,中等大小规模的数组排序表现良好,希尔排序不像快速排序和其它时间复杂度为O(n*logn)的排序算法那么快,因此,对非常大的文件排序,它不是最优选择,但是希尔排序比选择排序和插入排序这种时间复杂度为O(n²)的排序要快的多,并且它非常容易实现,代码简短

      希尔排序也是插入排序的一种,在插入排序中,如果最小的数在最后面,则复制的次数太多,而希尔解决了这个问题,它也是n-增量排序,它的思想是通过加大插入排序中元素的间隔,并在这些有间隔的元素中进行插入排序,当这些数据项排过一趟序后,希尔排序算法减小数据项的间隔再进行排序,依此进行下去。进行这些排序时数据项之间的间隔被称为增量,并且习惯上用字母h来表示。

      对于某个马上要进行希尔排序的数组,开始的间隔应该更大,然后间隔不段减小,直到间隔变为1.

    间隔序列:

      间隔序列中的数字素质通常被认为很重要-除了1之外它们没有公约数,这个约束条件使每趟排序更有可能保持前一趟排序已排好的效果,对于不同的间隔序列,有一个绝对的条件,就是逐渐减小的间隔最后一定要等于1.因此最后一趟是一次普通的插入排序。

      下面列出的例子是h=h*3+1的规律得出的:

     1 package com.jll.sort;
     2 
     3 public class ShellSort {
     4     int[] arr;
     5     int size;
     6     
     7     public ShellSort() {
     8         super();
     9     }
    10     
    11     public ShellSort(int size) {
    12         this.size = size;
    13         arr = new int[size];
    14     }
    15 
    16 
    17 
    18     /**
    19      * @param args
    20      */
    21     public static void main(String[] args) {
    22         ShellSort ss = new ShellSort(10);
    23         for(int i=0;i<10;i++){
    24             ss.arr[i] = (int) ((Math.random()*100)+1);
    25             System.out.print(ss.arr[i]+" ");
    26         }
    27         ss.shellSort();
    28         System.out.println();
    29         System.out.println("after sort:");
    30         for(int i=0;i<10;i++){
    31             System.out.print(ss.arr[i]+" ");
    32         }
    33         
    34     }
    35     
    36     public void shellSort(){
    37         int h = 1;
    38         while(h<=size/3){
    39             h = h*3+1;
    40         }
    41         for(;h>0;h=(h-1)/3){
    42             for(int i=h;i<size;i++){
    43                 int temp = arr[i];
    44                 int j = i;
    45                     while(j>h-1&&arr[j-h]>temp){
    46                         arr[j]=arr[j-h];
    47                         j-=h;
    48                     }
    49                     arr[j]=temp;
    50                 }
    51             }
    52         }
    53     }
  • 相关阅读:
    强制表格内容不换行
    数组深度
    JDBC连接SQLService时报错误:“驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接"
    Excel中神奇的vlookup函数之基础应用
    利用python进行泰坦尼克生存预测——数据探索分析
    pandas数据处理基础——基础加减乘除的运算规则
    pandas数据处理基础——筛选指定行或者指定列的数据
    python读取文本文件数据
    服务器硬件基础知识
    WordPress实现伪静态
  • 原文地址:https://www.cnblogs.com/lilyjia/p/3832619.html
Copyright © 2011-2022 走看看