关于希尔排序
- Java code
public void shellInertionSort(double [] sorted, int inc){ int sortedLen= sorted.length; for(int j=inc+1;j<sortedLen;j++ ){ if(sorted[j]<sorted[j-inc]){ sorted[0]= sorted[j];// ①先保存一下后面的那个 int insertPos=j; for(int k=j-inc;k>=0;k-=inc){ if(sorted[k]>sorted[0]){ sorted[k+inc]=sorted[k]; //数据结构课本上这个地方没有给出判读,出错: if(k-inc<=0){ insertPos = k; } }else{ insertPos=k+inc; break; } } sorted[insertPos]=sorted[0]; } } } public void shellInsertionSort(double [] sorted){ int[] incs={7,5,3,1}; int num= incs.length; int inc=0; for(int j=0;j<num;j++){ inc= incs[j]; shellInertionSort(sorted,inc); } } 在这段代码中,①所在的那句,那个sorted[0]没保存就被sorted[j]覆盖掉了,原来的sorted[0]呢?
这个例子中是从下标为1开始(第二个)那个元素开始打印,即忽略了第一个(下标为0)元素,
但是实际情况中要是给一些数据去排序,不可能扔掉第一个不要吧!
希望各位大侠给讲讲
[解决办法]
这个代码不全
这是因为在构建(生成)数组时
数组中的第一个(下标为0)数不会被赋值 最后也不会打印
所以下标为0的数被用来实现临时数据存储功能
[解决办法]
建议楼主把这段代码扔掉,然后再找本好书如《程序员实用算法》
[解决办法]
是呀,你的K[J]〉=0,使得SORTED[k]有可能是0,这样会把sorted[0]给破坏掉。
[解决办法]
- C/C++ code
void shillsort(int n) { int i,j; int t=1; while (t<n/4) t=t*2+1;//设置增量 while (t>0) { for (i=t;i<n;i++)//对每一块排序 { j=i; int d=a[i]; while(j>=t&&a[j-t]>d) { a[j]=a[j-t]; j-=t; } a[j]=d; } t/=2;//增量变小(即合并过程) } }