这个排序看起来比冒泡选择,插入都难,逻辑复杂一些。
凭直觉啊,就知道这个不简单,有点怕怕。
没有办法,给自己心理一个暗示,一定要看完这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