zoukankan      html  css  js  c++  java
  • 排序算法3--插入排序--希尔排序(缩小增量排序)

    希尔排序(缩小增量排序)

    希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。

    该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。

    以n=10的一个数组49, 38, 65, 97, 26, 13, 27, 49, 55, 4为例

    第一次 d = 10 / 2 = 5

    49   38   65   97   26   13   27   49   55   4

    1A                                        1B

            2A                                         2B

                     3A                                         3B

                             4A                                          4B

                                      5A                                         5B

    1A,1B,2A,2B等为分组标记,数字相同的表示在同一组,大写字母表示是该组的第几个元素, 每次对同一组的数据进行直接插入排序。即分成了五组(49, 13) (38, 27) (65, 49)  (97, 55)  (26, 4)这样每组排序后就变成了(13, 49)  (27, 38)  (49, 65)  (55, 97)  (4, 26),下同。

    第二次 d = 5 / 2 = 2

    排序后

    13   27   49   55   4    49   38   65   97   26

    1A             1B             1C              1D            1E

            2A               2B             2C             2D              2E

    第三次 d = 2 / 2 = 1

    4   26   13   27   38    49   49   55   97   65

    1A   1B     1C    1D    1E      1F     1G    1H     1I     1J

    第四次 d= 1 / 2 = 0 排序完成得到数组:

    4   13   26   27   38    49   49   55   65   97

    java实现

     1 package 平时常用;
     2 
     3 public class _7希尔排序 {
     4     public static void main(String[] args) {
     5         int[] a = {7,2,6,5,1,4,3};
     6         xierPaixu(a);
     7         for (int i : a) {
     8             System.out.print(i);
     9         }
    10     }
    11     public static void xierPaixu(int[] a){
    12         int d = a.length;
    13         while(d>=1){
    14             d = d/2;
    15             for (int i = d; i < a.length; i++) {
    16                     int temp = a[i];
    17                     int m ;
    18                     //对距离为d的数组进行排序
    19                     for (m = i-d; m>=0&& a[m]>temp; m=m-d) {
    20                         a[m+d] = a[m];
    21                     }
    22                     //插入到合适的位置插入
    23                     a[m+d] = temp;
    24                 }
    25         }
    26     }
    27 }

    js实现

     1 function xierSort(a){
     2     var d = a.length;
     3         while(d>=1){
     4             d = Math.floor(d/2);
     5             for (var i = d; i < a.length; i++) {
     6                     var temp = a[i];
     7                     var m ;
     8                     //对距离为d的数组进行排序
     9                     for (m = i-d; m>=0&& a[m]>temp; m=m-d) {
    10                         a[m+d] = a[m];
    11                     }
    12                     //插入到合适的位置插入
    13                     a[m+d] = temp;
    14                 }
    15         }
    16 }
    17 var a = new Array(7,2,6,5,1,4,3);
    18 xierSort(a);
    19 document.write("_3希尔排序"+a+"<br />");

    python实现:

     1 def shellSort(listNums):
     2     # 设定步长
     3     step = int(len(listNums)//2)
     4     while step > 0:
     5         for i in range(step, len(listNums)):
     6             # 类似插入排序, 当前值与指定步长之前的值比较, 符合条件则交换位置
     7             while i >= step and listNums[i-step] > listNums[i]:
     8                 listNums[i], listNums[i-step] = listNums[i-step], listNums[i]
     9                 i -= step
    10         step = step//2
    11     return listNums
  • 相关阅读:
    C++学习笔记32:泛型编程拓展1
    C++学习笔记31:术语翻译
    Sqrt(x)
    Search a 2D Matrix
    Pascal's Triangle II
    Pascal's Triangle
    Climbing Stairs
    Linux实用命令
    Binary Tree Inorder Traversal
    Minimum Depth of Binary Tree
  • 原文地址:https://www.cnblogs.com/zhangxue521/p/6748145.html
Copyright © 2011-2022 走看看