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)排序改进了插入排序,减少了比较的次数。是不稳定的排序,因为排序过程中元素可能会前后跳跃。 
  • 相关阅读:
    可以使用多少列创建索引?
    如何显示前 50 行?
    简单描述 MySQL 中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响-从读写两方面?
    实践中如何优化 MySQL ?
    列的字符串类型可以是什么?
    MySQL 里记录货币用什么字段类型好 ?
    什么是通用 SQL 函数?
    对于关系型数据库而言,索引是相当重要的概念?
    为表中得字段选择合适得数据类型?
    SQL 注入漏洞产生的原因?如何防止?
  • 原文地址:https://www.cnblogs.com/tryitboy/p/4231135.html
Copyright © 2011-2022 走看看