知识大全 排序 - 插入排序 - 希尔排序

Posted

篇首语:不操千曲而后晓声,观千剑而后识器。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 排序 - 插入排序 - 希尔排序相关的知识,希望对你有一定的参考价值。

  希尔排序(Shell Sort)是插入排序的一种 因D L Shell于 年提出而得名

  希尔排序基本思想

  基本思想

  先取一个小于n的整数d 作为第一个增量 把文件的全部记录分成d 个组 所有距离为d l 的倍数的记录放在同一个组中

  先在各组内进行直接插人排序;然后 取第二个增量d

  2

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

  给定实例的shell排序的排序过程

  假设待排序文件有10个记录,其关键字分别是:

  49,38,65,97,76,13,27,49,55,04。

  增量序列的取值依次为:

  5,3,1

  排序过程如【 动画模拟演示 】。

  Shell排序的算法实现

  1. 不设监视哨的算法描述

  void ShellPass(SeqList R,int d)

  //希尔排序中的一趟排序,d为当前增量

  for(i=d+1;i<=n;i++) //将R[d+1..n]分别插入各组当前的有序区

  if(R[i].key

  R[0]=R[i];j=i-d; //R[0]只是暂存单元,不是哨兵

  do //查找R[i]的插入位置

  R[j+d];=R[j]; //后移记录

  j=j-d; //查找前一记录

  while(j>0&&R[0].key

  R[j+d]=R[0]; //插入R[i]到正确的位置上

   //endif

   //ShellPass

  void ShellSort(SeqList R)

  

  int increment=n; //增量初值,不妨设n>0

  do

  increment=increment/3+1; //求下一增量

  ShellPass(R,increment); //一趟增量为increment的Shell插入排序

  while(increment>1)

   //ShellSort

  注意:

  当增量d=1时,ShellPass和InsertSort基本一致,只是由于没有哨兵而在内循环中增加了一个循环判定条件"j>0",以防下标越

  界。

  2.设监视哨的shell排序算法

  具体算法【参考书目[12] 】

  算法分析

  1.增量序列的选择

  Shell排序的执行时间依赖于增量序列。

  好的增量序列的共同特征:

  ① 最后一个增量必须为1;

  ② 应该尽量避免序列中的值(尤其是相邻的值)互为倍数的情况。

  有人通过大量的实验,给出了目前较好的结果:当n较大时,比较和移动的次数约在n l.25 到1.6n 1.25 之间。

  2.Shell排序的时间性能优于直接插入排序

  希尔排序的时间性能优于直接插入排序的原因:

  ①当文件初态基本有序时直接插入排序所需的比较和移动次数均较少。

  ②当n值较小时,n和n 2 的差别也较小,即直接插入排序的最好时间复杂度O(n)和最坏时间复杂度0(n 2 )差别不大。

  ③在希尔排序开始时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来增量d i 逐渐缩小,分组数逐渐

  减少,而各组的记录数目逐渐增多,但由于已经按d i-1 作为距离排过序,使文件较接近于有序状态,所以新的一趟排序过程也较快

  因此,希尔排序在效率上较直接插人排序有较大的改进。

  3.稳定性

  希尔排序是不稳定的。参见上述实例,该例中两个相同关键字49在排序前后的相对次序发生了变化。

cha138/Article/program/sjjg/201311/23805

相关参考

知识大全 第六部分 内部排序[3]

   希尔排序    希尔排序(ShellsSort)又称缩小增量排序是一种插入排序类的方法但在时间效率上有较大的改进    voidShellInsert(SqList

知识大全 数据结构第七章(图)串讲+复习要点

  排序是组织数据最基本的运算排序的方法也很多本章给出了几种典型的排序方法见下表  排序类别插入排序交换排序选择排序归并排序分配排序  排序方法直接插入冒泡法直接选择*归并排序箱排序  希尔排序*快速

知识大全 排序算法的各趟排序算法

  以关键字序列()为例分别写出执行以下排序算法的各趟排序结束时关键字序列的状态  ()直接插入排序()希尔排序()冒泡排序()快速排序  ()直接选择排序()堆排序()归并排序()基数排序  上述方

知识大全 排序算法的各趟排序算法

  以关键字序列()为例分别写出执行以下排序算法的各趟排序结束时关键字序列的状态  ()直接插入排序()希尔排序()冒泡排序()快速排序  ()直接选择排序()堆排序()归并排序()基数排序  上述方

知识大全 第8章排序(基础知识)习题练习

以关键字序列()为例分别写出执行以下排序算法的各趟排序结束时关键字序列的状态 ()直接插入排序()希尔排序()冒泡排序()快速排序 ()直接选择排序()堆排序()归并排序()基数排序  上述方法中哪些

知识大全 第8章排序(基础知识)习题练习答案

以关键字序列()为例分别写出执行以下排序算法的各趟排序结束时关键字序列的状态 ()直接插入排序()希尔排序()冒泡排序()快速排序 ()直接选择排序()堆排序()归并排序()基数排序  上述方法中哪些

知识大全 数据结构 10.5 希尔排序

  希赛教育计算机专业考研专业课辅导招生  希赛教育计算机专业考研专业课辅导视频  希赛教育计算机考研专业课在线测试系统  希尔排序又称缩小增量排序它的基本思想是先对待排序列进行宏观调整待序列中的记录

知识大全 排序 - 插入排序 - 直接插入排序(一)

  插入排序(InsertionSort)的基本思想是每次将一个待排序的记录按其关键字大小插入到前面已经排好序的子文件中的适当  位置直到全部记录插入完成为止  本节介绍两种插入排序方法直接插入排序和

知识大全 排序之二分插入排序

二分插入排序  二分插入排序查找操作利用二分查找来实现由此进行的插入排序称为二分插入排序二分插入排序算法 cha138/Article/program/sjjg/201311/23

知识大全 排序 - 插入排序 - 直接插入排序(二)

  哨兵的作用  算法中引进的附加记录R[]称监视哨或哨兵(Sentinel)  哨兵有两个作用  ①进人查找(插入位置)循环之前它保存了R[i]的副本使不致于因记录后移而丢失R[i]的内容;  ②它