希尔排序
2016-06-02 16:31
197 查看
private static void shell_Sort(int[] unsorted,int n){//希尔排序 int i,j,gap; for(gap=n/2;gap>0;gap/=2){ for(i=0;i<gap;i++){ for(j=i+gap;j<n;j+=gap){ if(unsorted[j]<unsorted[j-gap]){ int temp=unsorted[j]; int k=j-gap; while(k>=0&&temp<unsorted[k]){ unsorted[k+gap]=unsorted[k]; k-=gap; } unsorted[k+gap]=temp; } } } } }
个人觉得希尔排序是插入排序的改进版,完成这种排序的关键是得找到增量,找到增量之后把数组分割成子数组,然后分别运用插入排序的方式完成排序,其中最后一次的增量必定是1,其实要想插入排序的效率最高,就是这组数据不会是很乱的,而希尔排序使序列变得不在那么凌乱,这也是希尔排序效率较高的直接原因。
如代码所示,首先是gap的求法,查阅了相关资料之后,gap有种固定的求法,第一次是用数组元素的个数对2取整,接着每次用这个整数再对2取整,这样知道gap等于0时就退出循环,其中gap必有一次是等于1的。
代码分析:1.第一层的for循环是求增量,增量会越来越小,当增量为0时已经无需执行循环体了,所以就会退出循环
2.第二层循环是给出每次增量的个数,以让循环体内形成子数组。
3.其实这一层里面是插入排序的步骤,不同之处是直接的插入排序数字是连续的,而这种插入排序的各个元素是不连续的,但是他们也是有规律的,因为每个元素的位置之差就是一个增量的值,我们可以抽象的认为这个子数组也是一个连续的数组。
相关文章推荐
- 数列 [Bzoj3142,Codevs2089,HNOI2013]
- 【android】:android实现监听多个按钮事件
- 我的 VC++ 常见错误问题解决办法
- JavaScript:闭包
- PHP 5.5 新特性关键字 yield
- Python变量与常量
- shell 实例收集
- Picasso入门教程(三)
- CodeForces 24B-F1 Champions
- HDMI定义说明
- Codeforces #355 div.2
- 中广核项目进展
- Kubernetes开山篇
- mac下安装java开发环境===so easy.
- 浅谈编译高通android5.1源代码
- TextSwitcher类(TextView改变文本动画切换)
- Android.mk官方说明 中文翻译
- block
- 事件分发机制--解决事件冲突的经典方法
- BZOJ 2626 JZPFAR(KD-tree)