希尔排序(Shell Sort)

这个排序看起来比冒泡选择,插入都难,逻辑复杂一些。

凭直觉啊,就知道这个不简单,有点怕怕。

没有办法,给自己心理一个暗示,一定要看完这8个基本排序算法的,慢慢来吧。

java代码实现:


public static void shell_sort(int array[],int lenth){ 
int temp = 0; 
int incre = lenth; 
while(true){ 
incre = incre/2; 
for(int k = 0;k<incre;k++){
for(int i=k+incre;i<lenth;i+=incre){
for(int j=i;j>k;j-=incre){
if(array[j]<array[j-incre]){
temp = array[j-incre];
                      array[j-incre] = array[j];
                      array[j] = temp;
}
else{
break;
}
}
}
}
}
}

先把代码拿出来参考吧

整体思想:

在要排序的一组数中,根据某一增量分为若干子序列,并对子序列分别进行插入排序。
然后逐渐将增量减小,并重复上述过程。直至增量为1,此时数据序列基本有序,最后进行插入排序。

不理解,什么增量,这个概念都不说清楚。那我就自己的理解就是一个数,因为数有大小,那就有增量,增量就是一个数增加了多少。


我自己来说吧:在一个数组中,分组,然后对每一组用插入排序。怎么分组呢,就是开始对半分,对每一组又对半分就是了。这个就是他说的增量的递减了,

那最后到一组中只有一个数字了,那就不能分组了。

现在数组基本上九有序了,

最后来一下插入排序


设计步骤:

1.方法接受一个数组,一个length。这个length就是增量了,shell排序,就是增量分割排序。

2.真的不是想放弃的原因,实在是加载代码到脑子里可能又造成的短路之类的吧。

这个while(true)我想不到,现在我抄下来又有什么用,等到我自己写的时候又想不到,只能靠背诵,肯定背不出来的。之前就背过,脑子一片空

3,根据基本思想来了,在分组中是有一个循环分组的思想的,这里可能要用到了while循环的写法,什么时候退出,就是这个增量等于一了。

4.增量开始是传进来的数值,每走一趟循环,增量就除2.

5.                  for(int k = 0;k<incre;k++){
for(int i=k+incre;i<lenth;i+=incre){
for(int j=i;j>k;j-=incre)

这几个嵌套的循环是什么意思,不懂。


网上的人写的什么思路完全用不到,这个我觉得必须要分开一步步,思路都是假的,只有分开一步步,别人按照分开的一步步走下去没问题才行。我这里5就卡主了。

有必要说明一下这些个循环都是为什么。为了达到什么目的。

我自己的思路,是必须循环分开的左右两边的数组。

还是用数字带入理解一下了

increae就5

然后length是10

   for(int k = 0;k<5;k++){
for(int i=k+5;i<10;i+=5){
for(int j=i;j>k;j-=5)

有理解了:

最外层0到5循环,再里面是5到10一个循环。如果变量的换就是一个数组的左右两边

然后再里面一个循环是从10到5递减的判断一下 array[j]<array[j-incre]  10到5的数字中,后面的比前面小就交换一下,不是就进行下一次比较。

这两左右两边的数组都比较完了。

思想就是,我吧一个数组的左右两边的都循环一遍。


这个多层循环看来还是逻辑太复杂了。

自己还是没有清楚,FACK


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值