排序算法之希尔排序(Shellsort)
2016-05-16 09:18
633 查看
本文是自己在阅读《数据结构与算法分析c++描述》一书中的笔记、总结系列之一,主要会介绍排序算法中的谢尔排序的算法思想,代码实现。
第一种:谢尔增量 hth_t=⌊N2⌋\biggl\lfloor\frac N2\biggr\rfloor,t=hk+1h_{k+1}/2,hkh_k=⌊t2⌋\biggl\lfloor\frac t2\biggr\rfloor
第二种:Hibbard增量ht≈N2h_t \approx\frac N2, hk=2k−1h_k=2^k-1
使用谢尔增量时谢尔排序的最坏运行情形时间是Θ(N2)\Theta(N^2)。
使用Hibbard增量的谢尔排序的最坏情形的运行时间为Θ(N32)\Theta(N^\frac 32)。
当然还有许多其他已经提出的增量序列,其效果比Hibbard增量效果更好,这可以查阅文献来了解。本文以最为流行的(但效果不是很好)谢尔增量为例举一个实际的例子,并给出其代码实现。
example:example:
N=12,所以hth_t=⌊N2⌋=⌊122⌋=5\biggl\lfloor\frac N2 \biggr\rfloor=\biggl\lfloor\frac {12}2 \biggr\rfloor=5
首先进行6排序:
hk=⌊ht2⌋=62=3h_k=\biggl\lfloor\frac {h_t}2\biggr\rfloor=\frac 62=3
进行3排序:
最后进行1排序:
1排序的实质是插入排序,但由于经过6排序和3排序,此时的无序数列已经有一定的顺序,所以插入排序会进行较少的交换逆序即可。
谢尔排序之算法思想
谢尔排序使用一个序列hth_t,ht−1h_{t-1},…h2h_2,h1h_1来作为间隔排序,理论上只要h1h_1=1的任意递减序列都可以。但推荐两种序列:第一种:谢尔增量 hth_t=⌊N2⌋\biggl\lfloor\frac N2\biggr\rfloor,t=hk+1h_{k+1}/2,hkh_k=⌊t2⌋\biggl\lfloor\frac t2\biggr\rfloor
第二种:Hibbard增量ht≈N2h_t \approx\frac N2, hk=2k−1h_k=2^k-1
使用谢尔增量时谢尔排序的最坏运行情形时间是Θ(N2)\Theta(N^2)。
使用Hibbard增量的谢尔排序的最坏情形的运行时间为Θ(N32)\Theta(N^\frac 32)。
当然还有许多其他已经提出的增量序列,其效果比Hibbard增量效果更好,这可以查阅文献来了解。本文以最为流行的(但效果不是很好)谢尔增量为例举一个实际的例子,并给出其代码实现。
example:example:
N=12,所以hth_t=⌊N2⌋=⌊122⌋=5\biggl\lfloor\frac N2 \biggr\rfloor=\biggl\lfloor\frac {12}2 \biggr\rfloor=5
首先进行6排序:
hk=⌊ht2⌋=62=3h_k=\biggl\lfloor\frac {h_t}2\biggr\rfloor=\frac 62=3
进行3排序:
最后进行1排序:
1排序的实质是插入排序,但由于经过6排序和3排序,此时的无序数列已经有一定的顺序,所以插入排序会进行较少的交换逆序即可。
谢尔排序之代码实现
#include <iostream> #include <vector> #include <math.h> using namespace std; void shellsort(vector<int> &arrayinput) { int N = arrayinput.size(); int h_t = floor(N / 2); while (h_t >= 1) { for (int i = 0; i < arrayinput.size(); i++) { for (int j = 1; i + j*h_t < arrayinput.size(); j++) { int k; int tmp = arrayinput[i + j*h_t]; for (k = j; k > 0 && tmp < arrayinput[i + (k-1)*h_t]; k--) arrayinput[i + k*h_t] = arrayinput[i + (k-1)*h_t]; arrayinput[i + k*h_t] = tmp; } } h_t = floor(h_t / 2) ; } } void main() { int a; vector<int> arrayinput; cout << "please input :"; while (cin >> a) arrayinput.push_back(a); shellsort(arrayinput); for(auto b : arrayinput) cout << b << " "; getchar(); }
相关文章推荐
- Shell标准输出、标准错误
- linux input output i/o重定向 bash算术运算
- 如何让Windows恋上Linux bash
- linux及shell相关学习
- TaskScheduler内幕天机:Spark shell案例,TaskScheduler和SchedulerBackend、FIFO与FAIR、Task运行时本地性算法详解
- 解释器/bin/sh和/bin/bash的区别
- 在shell脚本中调用另一个脚本的三…
- 快速排序、冒泡排序、堆排序、shell排序的递归和非递归实现
- shell从入门到放弃(下)
- 【Linux】Shell的变量
- IT-linux-shell-command--usleep
- Shell中使用grep、sed正则提取、替换字符串
- 如何用shell实现基本的线程池
- shell操作mysql之增删改查
- Shell脚本学习指南(四)——文本处理工具
- Shell脚本学习指南(三)——正则表达式
- Shell脚本输出斐波拉契数列前十项,每行显示两个数
- Shell 脚本中如何使用make命令
- 让你提升命令行效率的 Bash 快捷键 [完整版]
- powershell remote on computer