1.原理介绍

希尔排序又称为缩小增量排序,由D.L.Shell在1959年提出而得名。

该算法先取一个小于数据表中元素个数 n 的整数gap, 并以此作为第一个间隔,将数据分为gap个子序列,所有距离为gap的对象存放在同一个子序列中,于是数据表中的元素就被分成了gap个组,分组确定后,在每一个小组中进行直接插入排序(参考直接插入排序与二分插入排序的C++实现),局部排序完成后,缩小gap, 重复上述步骤,直至取到gap=1时,完成最后一次直接插入排序。

为什么这个算法会起作用:开始的时候gap较大,子序列中的数据较少,所以最开始的时候算法运行较快,随着算法进行,gap 逐渐变小,子序列中元素的个数也就越来越多,所以排序工作可能会变慢,但是由于前面已经完成了部分排序工作,因而在很大程度上减轻了后来的工作量,于是最终总体的排序速度还是比较快的。

2.举例说明

数据表:

第一轮:数据表共有6个元素,初始化gap = 6, 第一轮取取gap = MT(gap/2)=3,注意这里MT(X)表示取不小于X的最小整数,即向上取整!

第二轮:gap = MT(gap/2)=2;

第三轮:gap = MT(gap/2) = 1,但是由于第二轮结束后数据表实际上已经有序了,因此第三轮做的事几乎为0.

3.C++实现

 #ifndef SHELLSORT_H
#define SHELLSORT_H
#include <vector>
#include <iostream>
using std::vector;
using std::cout;
using std::endl; template <typename T>
class ShellSort
{
private:
unsigned len;
vector<T> list;
public:
/*
* Construction function
*/
ShellSort(vector<T> _list, unsigned _len)
{
for (unsigned i = ; i < _len; ++i) list.push_back(_list[i]);
this->len = _len;
}
/*
* Shellsort function
*/
void shellSort()
{
int insertNum;
unsigned gap = len/; // initial increment
while(gap) // while gap>=1
{
for (unsigned i = gap; i < len; ++i) // Insertsort within subsequence
{
insertNum = list[i];//Target number to be inserted into the subsequence
unsigned j = i;
while (j >= gap && insertNum < list[j-gap])//Find position
{
list[j] = list[j - gap];
j -= gap;
}
list[j] = insertNum;
}//end for
gap /= ;
}//end while(gap)
}// end shellSort /*
* Display the sorted result
*/
void out()
{
for (unsigned i = ; i < len; ++i)
{
cout << list[i] << " ";
if ((i + ) % == ) cout << endl;
}
cout << endl;
}
};
#endif //shellSortTest
#include "ShellSort.h"
#include <vector>
using namespace std; const unsigned numEle = ;
int data[numEle] = {,,,,,,,}; int main()
{
vector<int> testData;
for (unsigned i = ; i < numEle; ++i) testData.push_back(data[i]); ShellSort<int> test(testData, numEle);
test.shellSort();
test.out();
return ;
}

4.参考文献

左飞:C++数据结构原理与经典问题求解

数据结构复习:希尔排序的C++实现的更多相关文章

  1. python数据结构之希尔排序

    def shell_sort(alist): n=len(alist) gap= int(n / 2) #步长 while gap>0: for i in range(gap,n): j=i w ...

  2. Java数据结构和算法(五)--希尔排序和快速排序

    在前面复习了三个简单排序Java数据结构和算法(三)--三大排序--冒泡.选择.插入排序,属于算法的基础,但是效率是偏低的,所以现在 学习高级排序 插入排序存在的问题: 插入排序在逻辑把数据分为两部分 ...

  3. JavaScript 数据结构与算法之美 - 归并排序、快速排序、希尔排序、堆排序

    1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算 ...

  4. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  5. javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法)

    javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法) 一.快速排序算法 /* * 这个函数首先检查数组的长度是否为0.如果是,那么这个数组就不需要任何排序,函数直接返回. * ...

  6. SDUT OJ 3403 数据结构实验之排序六:希尔排序

    数据结构实验之排序六:希尔排序 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descrip ...

  7. SDUT 3403 数据结构实验之排序六:希尔排序

    数据结构实验之排序六:希尔排序 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 我们已经学习 ...

  8. 数据结构 - 希尔排序(Shell&#39;s Sort) 具体解释 及 代码(C++)

    数据结构 - 希尔排序(Shell's Sort) 具体解释 及 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2 ...

  9. 数据结构与算法系列——排序(4)_Shell希尔排序

    1. 工作原理(定义) 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本.但希尔排序是非稳定排序算法. 希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入 ...

随机推荐

  1. C# 中对WinForm窗体中的控件快速设置TableIndex次序

    点击“视图”--“Tab键顺序”,然后便可设置.

  2. INDEX_JOIN

    这里就以INDEX_JOIN为例,简单描述一下如何影响Oracle的执行计划的产生. 控制执行计划最简单的方法莫过于使用HINT,这篇文章要介绍的是,在不使用HINT的情况下,让Oracle产生IND ...

  3. linux笔记_20150417_ubuntu 常见问题_文件_音乐播放器

    最近在学习ubuntu的过程中,遇到了一些问题,就记下来了它的解决办法.以希望对你也有用. ),至少保证周围局域网内用户可以访问.至于配置文件,内容比较少,反正对我来讲能用就ok了~不知道会不会很弱 ...

  4. css3 --- 翻页动画 --- javascript --- 3d --- Action

    用css3和javascript做一个翻页动画<Action> 如有疑问请参照我的上一篇随笔:http://www.cnblogs.com/kodoyang/p/Html_Css3_Car ...

  5. 精品手游《里奥的财富》高清版逆向移植家用机与PC平台(转)

    冒险动作游戏<里奥的财富>于去年10月登陆移动平台,曾荣获App Store“年度优秀游戏”.开发商宣布将推出其HD版本,近期会陆续登陆PS4.PC.MAC.Xbox One平台. 由瑞典 ...

  6. leetcode刷题总结一

    大四狗找工作,要刷题了,leetcode上面题目比较适合面试算法类题目,也不纯粹为了蒙题,锻炼一下面试类型的思维 Single Number: 有N个数,其中只有一个数出现了一次,其他都是两次,找出那 ...

  7. 指定的值不是类型“Edm.Int32”的实例

    指定的值不是类型“Edm.Int32”的实例参数名: value 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常 ...

  8. jszs 对象引用

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  9. 给Asp.net MVC Forms 验证设置角色访问控制

    当我们使用Asp.net MVC Forms方式验证用户, 然后设置Controller 或 Action 的 Authorize属性时, 默认情况下只有Users属性可以设置(这里的Users通常是 ...

  10. HD1064Financial Management

    Problem Description Larry graduated this year and finally has a job. He's making a lot of money, but ...