希尔排序思想:设置增量d1,所有距离d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;
然后取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1
从插入排序发展而来,插入排序相当于希尔排序的增量为1的特殊情况
java代码实现:
public class ShellSort {
public static void shellSort(int[] a ,int[] d){
int i,j,k,m,temp,span;
int n =a.length;
int L = d.length;
for(m=0;m<L;m++){//大的循环做L趟
span=d[m];
for(k=0;k<span;k++){//每趟循环都对“各个小组”进行排序
for(i=k;i<n-span;i+=span){
temp = a[i+span];
j=i;
while(j>=k&&temp<a[j]){
a[j+span]=a[j];
j=j-span;
}
a[j+span]=temp;
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int a[] = {-1,4,1,-3,3,5,7,9,8,2,4,6,8,0};//?测试用例
int d[] = {5,3,1};
shellSort(a,d);
for(int i=0;i<a.length;i++){
System.out.print(a[i]+",");
}
}
}
然后取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1
从插入排序发展而来,插入排序相当于希尔排序的增量为1的特殊情况
java代码实现:
public class ShellSort {
public static void shellSort(int[] a ,int[] d){
int i,j,k,m,temp,span;
int n =a.length;
int L = d.length;
for(m=0;m<L;m++){//大的循环做L趟
span=d[m];
for(k=0;k<span;k++){//每趟循环都对“各个小组”进行排序
for(i=k;i<n-span;i+=span){
temp = a[i+span];
j=i;
while(j>=k&&temp<a[j]){
a[j+span]=a[j];
j=j-span;
}
a[j+span]=temp;
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int a[] = {-1,4,1,-3,3,5,7,9,8,2,4,6,8,0};//?测试用例
int d[] = {5,3,1};
shellSort(a,d);
for(int i=0;i<a.length;i++){
System.out.print(a[i]+",");
}
}
}