zoukankan      html  css  js  c++  java
  • 经典算法学习:排序之希尔排序(壳排序)

    壳排序(希尔排序)

    shell排序的思想是根据步长由长到短分组,进行排序,直到步长为1为止,属于插入排序的一种。

    shell排序是对插入排序的一个改装,它每次排序把序列的元素按照某个增量分成几个子序列,对这几个子序列进行插入排序,然后不断的缩小增量扩大每个子序列的元素数量,直到增量为一的时候子序列就和原先的待排列序列一样了,此时只需要做少量的比较和移动就可以完成对序列的排序了。


    实例:

    无序数列: 32, 43,56,99,34,8,54,76

    1.首先设定gap=n/2=4于是分组

    32,34  排序  32,34
    43, 8    排序   8, 43
    56,54   排序  54,56
    99,76   排序  76,99
    数列变成 32,8,54,76,34,43,56,99
    2.gap=gap/2=2 于是分组
    32,54,34,56 排序 32,34,54,56
    8,76,43,99   排序8,43,76,99
    于是数列变成 32,8,34,43,54,76,56,99
    3.gap=gap/2=1于是分组
    32,8,34,43,54,76,56,99  排序
    8,32,34,43,54,56,76,99
    gap=1

    结束


    代码:

    1. public static void sort1(int s[]) {  
    2.         int d = s.length;  
    3.         d = d / 2;  
    4.         int temp = 0;  
    5.         while (true) {  
    6.             for (int i = 0; i < d; i++) {  
    7.                 for (int j = i; j + d < s.length; j += d) {  
    8.                     if (s[j] > s[j + d]) {  
    9.                         temp = s[j];  
    10.                         s[j] = s[j + d];  
    11.                         s[j + d] = temp;  
    12.                     }  
    13.                 }  
    14.             }  
    15.             if (d == 1) {  
    16.                 break;  
    17.             }  
    18.             d--;  
    19.         }  
    20.     }  

    适用于排序小列表。 
    效率估计O(nlog2^n)~O(n^1.5),取决于增量值的最初大小。建议使用质数作为增量值,因为如果增量值是2的幂,则在下一个通道中会再次比较相同的元素。 
    壳(Shell)排序改进了插入排序,减少了比较的次数。是不稳定的排序,因为排序过程中元素可能会前后跳跃。 
  • 相关阅读:
    margin 碰到过的重叠问题
    等宽字体延伸到的 ch 长度单位和动画 animation-timing-function
    三栏布局 左右固定 中间自适应
    左侧固定,右侧自适应的五种布局方式
    jmeter环境配置
    python3 + selenum 环境搭建
    win10系统安装loadrunner11提示“为了对电脑进行保护 已经阻止此应用”的解决方案
    关于loadrunner运行场景时提示“初始化失败,通信错误”的解决方案
    安装phpwind报错
    关于XAMPP Apache无法启动问题解决方案
  • 原文地址:https://www.cnblogs.com/tryitboy/p/4231135.html
Copyright © 2011-2022 走看看