【原理】
1.选择一个步长序列T1,T2,T3...,Tk,满足Ti>Tj(i<j),Tk=1。(步长:即每次插入排序的步长)
2.按步长序列的个数K,对待排序序列进行K趟排序。
3.每趟排序,根据对应的步长Ti,对待排序列分割成Ti个子序列,分别对子序列进行插入排序。
【用例】
待排列数组
[ 26 53 67 48 57 13 48 32 60 50 ]
初始化关键字:(此时步长为5)
第一趟结果
[ 13 48 32 48 50 26 53 67 60 57 ]
初始化(此时步长为3)
[ 13 48 32 48 50 26 53 67 60 57 ]
第二趟结果
[13 48 26 48 50 32 53 67 60 57]
初始化:此时步长为1
[13 48 26 48 50 32 53 67 60 57]
第三趟结果
[13 26 32 48 48 50 53 57 60 67]
[代码实现]
package com.sort; public class TestShellSort { public static void shellSort(int[] array){ int length=array.length; int i,j; int h; //h为每次的步长 int temp; for(h=length/2;h>0;h=h/2){ //步长每次减小为原来的1/2 for(i=h;i<length;i++){ //从array[h]开始,往后。第一次即从中间位置往后开始,第二次往后挪一位 temp=array[i]; //保存数据至temp for(j=i-h;j>=0;j=j-h){ //第一次j从0开始,结束该循环。第二次进入该循环j从1开始,因为i增加1了,这段代码保证每次都是步长为h的两个数据在比较 if(temp<array[j]){ //如果发现比temp大的数据,将该数据放置在位置array[j+h] array[j+h]=array[j]; }else{ break; } } array[j+h]=temp; } } } public static void main(String[] args){ int a[]={2,9,0,8,7,1,5,4,3,6}; shellSort(a); for(int i=0;i<a.length;i++){ System.out.print(a[i]+" "); } } }
【总结】
希尔排序的关键并不是随便的分组后各自排序,而是将相隔某个“步长”的数据组成一个新的子序列,实现跳跃式移动,使得排序的效率提高。
https://i.cnblogs.com/EditPosts.aspx?postid=5716868&update=1