Shell排序
2016-04-06 15:30
721 查看
Shell排序:一种插入排序。
距离的概念:两个数之间的间隔i个数,这两个数的距离就为i
例如:1,2,3,4,5,6,7,8。1和2的距离为1;1和3的距离为2。
基本思想:先取一个增量d1<n,把待排序的数组按照增量分组,距离为增量d1的分到相同的组,相同组的数据按插入排序排序。接着取d2<d1,重复上面的过程,直到di=1<d(i-1)<…<d1为止。
/* Shell排序: O(nlogn) 设定一个元素间隔的增量nGap,将参加排序的元素按这个间隔数nGap从第1个元素开始依次分为若干个 子序列,分别对这些子序列排序。重复下去,直到间隔数减少为1。(间隔数每次除以2递减可以保证最后一次间隔数为1) */ #include <iostream> #include <time.h> using namespace std; #define N 16 void PrintArr(int *pnArr, int nLen) { int i; for (i = 0; i < nLen; i++) { cout<<pnArr[i]<<" "; } cout<<endl; } //从小到大排序 void ShellSort(int *pnArr, int nLen) { int i, j; int nGap; int nTmp; for (nGap = nLen/2; nGap > 0; nGap /= 2) { for (i = nGap; i < nLen; i++) { nTmp = pnArr[i]; for (j = i; j > 0 && nTmp < pnArr[j-nGap]; j-= nGap) { pnArr[j] = pnArr[j-nGap]; } pnArr[j] = nTmp; } PrintArr(pnArr, nLen); } } int main() { int nArr = {0}; int i; srand(time(NULL)); for (i = 0; i < N; i++) { nArr[i] = rand() % 100; } PrintArr(nArr, N); ShellSort(nArr, N); return 0; }
相关文章推荐
- webhdfs 使用shell下载文件
- Ubuntu下将命令行封装成全局命令
- PowerShell 多线程的使用
- Linux Shell 文本处理工具集锦
- shell脚本之条件测试
- I.MX6 Android Linux shell MMPF0100 i2c 设置数据
- shell编程之运算符
- 日常 shell 命令汇总
- shell脚本之echo命令
- Bash玩转脚本2之自己的脚本管理工具
- shell 处理文本工具集合(常用命令)
- shell中的${},##和%%的使用
- Ubuntu 改动bash
- Linux进阶之bash编程(流程控制if-else)
- linux awk和其它shell 编程变量
- Shell去掉文件中的空行
- Shell实用技巧:快速去除字符串中的空格
- Shell类似于C语言的for循环
- shell判断文件是否存在
- Shell Script控制语句