3. 235619487
4. 123569487
5. 123456987
6. 123456897
7. 123456789
8. 123456789
3 希尔排序(Shell 排序)
希尔排序(缩小增量法) 属于插入类排序,由 Shell 提出,希尔排序对直接插入排序进行
了简单的改进:它通过加大插入排序中元素之间的间隔,并在这些有间隔的元素中进行插
入排序,从而使数据项大跨度地移动,当这些数据项排过一趟序之后,希尔排序算法减小
数据项的间隔再进行排序,依次进行下去,进行这些排序时的数据项之间的间隔被称为增
量,习惯上用字母 h 来表示这个增量。
常用的 h 序列由 Knuth 提出,该序列从 1 开始,通过如下公式产生:h = 3 * h +1
反过来程序需要反向计算 h 序列,应该使用 h=(h-1)/3
代码实现:×
1. publicclassShellSortTest{
2. publicstaticintcount=0;
3. publicstaticvoidmain(String[]args){
4. int[]data=newint[]{5,3,6,2,1,9,4,8,7};
5. print(data);
6. shellSort(data);
7. print(data);
8. }
9.
10. publicstaticvoidshellSort(int[]data){
11. //计算出最大的 h 值××
12. inth=1;
13. while(h<=data.length/3){
14. h=h*3+1;
15. }
16. while(h>0){
17. for(inti=h;i<data.length;i+=h){
18. if(data[i]<data[i-h]){
19. inttmp=data[i];
20. intj=i-h;
21. while(j>=0&&data[j]>tmp){
22. data[j+h]=data[j];
23. j-=h;
24. }
25. data[j+h]=tmp;
26. print(data);
27. }