博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
希尔排序(shell sort)
阅读量:4217 次
发布时间:2019-05-26

本文共 951 字,大约阅读时间需要 3 分钟。

希尔排序(改进的插入排序):

希尔排序属于插入类排序,是将整个有序序列分割成若干小的子序列分别进行。
排序过程:先取一个正整数d1<n,把所有序号相隔d1的元素放一组,组内进行;然后取d2<d1,重复上述分组和排序操作;直至di=1,即所有记录放进一个组中排序为止。
但是: 希尔排序会改变相同元素的原先相对位置, 也就是说希尔排序是不稳定的。

原理: 通过较大的间距抽取元素进行排序,有效的减少逆序对 从而提高排序效率。

实现:

d 选取好坏会影响排序的效果 这里是d/2(并非好的选择)

void shell_sort(int a[], int n)	{		int i, j, d;		int tmp;		for(d = n/2; d > 0; d /= 2){ //最后 d 为 1 			for(i = d; i < n; i++ ){//从d开始往后依此排 与当前元素相差d整数倍距离的元素				tmp = a[i];				for(j = i; j >= d && a[j-d] > tmp; j -= d){					a[j] = a[j-d];				}				a[j] = tmp;			}		}	}

改进的希尔排序:(使用Sedgewick增量序列)

void shell_sort(int a[], int n)	{		int i, j, d;		int tmp;		int Si;		int Sedgewick[] = {929, 505, 209, 109, 41, 19, 5, 1, 0}; 		for(Si = 0;  Sedgewick[Si] >= n; Si++ )//最大增量需要小于数组大小		for(d = Sedgewick[Si]; d > 0; d = Sedgewick[++Si]){ //最后 d 为 1 			for(i = d; i < n; i++ ){				tmp = a[i];				for(j = i; j >= d && a[j-d] > tmp; j -= d){					a[j] = a[j-d];				}				a[j] = tmp;			}		}	}

改进后的希尔排序 时间复杂度 平均可以为 O(N^(7/6))

转载地址:http://xximi.baihongyu.com/

你可能感兴趣的文章
HQL排查数据倾斜
查看>>
DAG以及任务调度
查看>>
LeetCode——DFS
查看>>
MapReduce Task数目划分
查看>>
ZooKeeper分布式锁
查看>>
3126 Prime Path
查看>>
app自动化测试---ADBInterface驱动安装失败问题:
查看>>
RobotFramework+Eclipse安装步骤
查看>>
测试的分类
查看>>
photoshop cc2019快捷键
查看>>
pycharm2019版本去掉下划线的方法
查看>>
九度OJ 1091:棋盘游戏 (DP、BFS、DFS、剪枝)
查看>>
leetcode 13: Roman to Integer
查看>>
a标签中调用js方法
查看>>
js函数中传入的event参数
查看>>
[hive]优化策略
查看>>
c++14现代内存管理
查看>>
右值引用,move语义和完美转发
查看>>
c++使用宏检测类是否包含某个函数或者变量属性
查看>>
CSS之Multi-columns的column-gap和column-rule
查看>>