学到希尔排序了,感叹两句吧

希尔排序

只是在用插入排序的时候,不是挨着操作,而是跳着来做.

也就是分组.

 

插入排序,是 占了一队,直接排序

现在,希尔排序,N个队伍,分别排序.(N是分量len之一.,len=len/2,循环)

 

N不断变化,多次N对分别排序后, 大的数字基本跟小的数字分开了.

 

===========

为什么要多次分组,多次排序?

 

我想,分组,其实是把一维数组,搞成了二维的,所以我尝试 做成 正方形的二维数组. X=开方(len)+1; int  data[X][X]

 

然后,如果 二维数组是 行列式的话, 首先行排序,(希尔排序是不断地修改二维数组的行和列的值,不断给行排序,不给列排序)我捉摸着,为什么不,把行排一次,然后把列排一次呢?

 

这样,这个二维数组,做成立体图像的话,铺在桌子上,数字是坑的话, 整个 二位数字,就是一个圆坑的四分之一的样子. 0,0点就是最小的点.

 

谁是第二小的点呢?肯定是 0,0点,的上面或者右边的点.(0+1,0) 或者 (0,0+1)

只需要比较这俩点的数据就可以找出第二小的.把这俩点位置的数据加入对比列表.

 

把第二小找到,,并从对比列表删掉.

然后,加入 第二小的这个点的,上方,右方的数据,到对比列表.

循环,直到 找到所有点为止.

 

 

可惜算的很慢. 而且不容易写对.

===========

 

让后想了另一个方法.

也是做成二维数组的样子

 

然后,一次希尔排序后,(比如分量是5)

 

然后就把这些数据,做成5列的数组.

 

数组就像压面条的机器上的 面饼子一样

 

循环第一行五个数字,找出最小的,输出,然后删除那个最小的,最小的数字所在的列的数组所有数字往前移.用链表是不是更快?

 

当时这样并不快.

 

每次那一行5个数字,我都是全部重新对比的,其实可以排序后,删掉最小的.然后新顶上来的那个数字,做插入排序,效率应该会更高?好像没区别.都是对比四次的.

 

 

这个倒是可以正确,但是依然干不过 希尔排序.

 

=================

看人家的代码

​代码精炼,毫无额外损耗.真是令人感叹啊.

 

posted @ 2018-11-08 21:41  interim  阅读(233)  评论(0编辑  收藏  举报