zoukankan      html  css  js  c++  java
  • 排序算法之希尔排序

    希尔排序算法简介:

      希尔排序属于插入类排序,是将整个无序列分割成若干小的子序列分别进行插入排序。
      排序过程:先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,组内进行直接插入排序;然后取d2<d1,重复上述分组和排序操作;直至di=1,即所有记录放进一个组中排序为止。

    希尔排序算法思想:

      先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

      该方法实质上是一种分组插入方法

    希尔排序算法模拟:(参考严蔚敏版数据结构)

    希尔排序算法参考代码:

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 //希尔排序
     6 void shellSort(int iarr[],int length)
     7 {
     8     int dt[3] = {5,3,1},i =0 ,j,k,temp;
     9     for(j = 0; j < 3; ++j)
    10     {
    11         for(i = dt[j]; i < length; ++i)
    12         {
    13             temp = iarr[i];
    14             k = i - dt[j];
    15             while(temp < iarr[k] && k >= 0)
    16             {
    17                 iarr[k + dt[j]] = iarr[k];
    18                 k -= dt[j];
    19             }
    20             iarr[k + dt[j]] =  temp;
    21         }
    22     }
    23 }
    24 int main()
    25 {
    26     int a[25]={4,1,3,2,16,9,10,14,8,7,7,10,7,28,30,3,12,0,1,3,9,12,11,4,19};
    27     shellSort(a,25);
    28     for(int i=0;i < 25; ++i)
    29         cout << a[i] << " ";
    30     return 0;
    31 }

    希尔排序算法复杂度分析:

      不需要大量的辅助空间,和归并排序一样容易实现。希尔排序是基于插入排序的一种算法, 在此算法基础之上增加了一个新的特性,提高了效率。希尔排序的时间复杂度与增量序列的选取有关,例如希尔增量时间复杂度为O(n²),而Hibbard增量的希尔排序的时间复杂度为O(

    ),但是现今仍然没有人能找出希尔排序的精确下界。希尔排序没有快速排序算法快 O(n(logn)),因此中等大小规模表现良好,对规模非常大的数据排序不是最优选择。但是比O(
    )复杂度的算法快得多。并且希尔排序非常容易实现,算法代码短而简单。 此外,希尔算法在最坏的情况下和平均情况下执行效率相差不是很多,与此同时快速排序在最坏的情况下执行的效率会非常差。专家们提倡,几乎任何排序工作在开始时都可以用希尔排序,若在实际使用中证明它不够快,再改成快速排序这样更高级的排序算法. 本质上讲,希尔排序算法是直接插入排序算法的一种改进,减少了其复制的次数,速度要快很多。 原因是,当n值很大时数据项每一趟排序需要的个数很少,但数据项的距离很长。当n值减小时每一趟需要和动的数据增多,此时已经接近于它们排序后的最终位置。 正是这两种情况的结合才使希尔排序效率比插入排序高很多。
      算法稳定性:不稳定!

     

  • 相关阅读:
    ES6 | 关于class类 继承总结
    ES6 | class类的基本语法总结
    开发辅助 | 阿里图标库iconfont入门使用
    JS基本功 | JavaScript专题之数组 方法总结
    前端模块化 | 解读JS模块化开发中的 require、import 和 export
    IOS开发中UITableView和UITableViewCell的几种样式
    SSM项目的搭建
    Linux离线安装Docker
    Http项目转Https项目
    SpringBoot项目的搭建
  • 原文地址:https://www.cnblogs.com/zhuwbox/p/3632261.html
Copyright © 2011-2022 走看看