九大排序之——希尔排序
来源:互联网 发布:臭氧灯能除螨虫知乎 编辑:程序博客网 时间:2024/05/16 14:35
希尔排序:
思想:
希尔排序是为了防止直接插入排序出现最坏情况所做的一种改进,将原本的排序过程分为预排序和直接插入排序两个阶段。
预排序阶段:将整个预排序的序列分为若干个待排序的子序列,分别进行插入排序,然后依次缩减分量;
直接插入排序阶段:待增量不断缩减后,序列基本达到有序状态,此时在进行一次直接插入排序。
图解示例(红色为有序序列黑色为无序序列)
代码实现:
#include<iostream>#include<assert.h>using namespace std;template<class T>void Print(const T* a, size_t n){for (size_t i = 0; i < n; ++i){cout << a[i] << " ";}cout << endl;}template<class T>struct Less//升序{bool operator()(const T& l, const T& r){return l < r;}};template <class T>struct Great//降序{bool operator()(const T& l, const T& r){return l > r;}};template<class T,class Compare>void ShellSort(T* a,size_t n){assert(a);int gap = n;while (gap > 1){gap = gap / 3 + 1;//+1是为了最后一次对全体数据进行插入排序for (size_t i = gap; i < n; i++){int end = i - gap;T tmp = a[i];while (end >= 0){if (Compare()(tmp, a[end])){a[end + gap] = a[end];end = end - gap;}elsebreak;}a[end + gap] = tmp;}}}void TestShellSort(){int a[] = { 3, 5, 7, 2, 4, 1, 9, 8, 6 };ShellSort<int, Less<int>>(a, sizeof(a) / sizeof(a[0]));Print(a, sizeof(a) / sizeof(a[0]));ShellSort<int, Great<int>>(a, sizeof(a) / sizeof(a[0]));Print(a, sizeof(a) / sizeof(a[0]));}
执行结果:
复杂度和稳定性:
时间复杂度:O(N)~O(N^2)
空间复杂度:O(1)
稳定性:不稳定
0 0
- 九大排序之——希尔排序
- 九大排序之——基数排序
- 九大排序之——冒泡排序
- 九大排序之——堆排序
- 九大排序之——选择排序
- 九大排序之——插入排序
- 九大排序之——快速排序
- 九大排序之——归并排序
- 九大排序之——计数排序
- 排序—希尔排序
- 排序—希尔排序
- 排序——希尔排序
- 排序——希尔排序
- 排序——希尔排序
- 排序——希尔排序
- 排序——希尔排序
- 内部排序—希尔排序
- 插入排序—希尔排序
- HDU 4114 Disney's FastPass(floyd+状态压缩DP)
- 线段树(类似延迟标记) HDU
- CvArr、Mat、CvMat、IplImage、BYTE;QPixmap和QImage
- 用python脚本实现自动部署环境(一)
- 二叉树以及遍历算法
- 九大排序之——希尔排序
- ZOJ2975
- mybatis中插入数据自动返回自增长id的配置
- Qt软件开发文档8---登陆界面的绘制及其封装
- IntelliJ IDEA 乱码解决方案 (项目代码、控制台等)
- poj 2318 TOYS(叉积)
- Lintcode18 Subsets II solution 题解
- 自定义TextView显示.ttf文件中的字符
- 鼠标掠过显示图片的demo