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)排序改进了插入排序,减少了比较的次数。是不稳定的排序,因为排序过程中元素可能会前后跳跃。 
  • 相关阅读:
    用Python完成一个汇率转换器
    鸿蒙如何用JS开发智能手表App
    鸿蒙如何用JS开发智能手表App
    SAP Spartacus SplitViewComponent Migration 的一个具体例子
    SAP Spartacus B2B 页面 Popover Component 的条件显示逻辑
    SAP Spartacus 升级时关于 schematics 的更新
    SAP Spartacus B2B 页面 Disable 按钮的显示原理
    SAP Spartacus B2B 页面 Disable Confirmation 对话框的显示原理
    通过 Feature Level 动态控制 SAP Spartacus 的页面显示
    SAP Commerce Cloud Build Manifest Components
  • 原文地址:https://www.cnblogs.com/tryitboy/p/4231135.html
Copyright © 2011-2022 走看看