声明:和小强一起学习数据结构java版本系列文章都是小强在学习程杰先生《大话数据结构》的过程中写的,因为程杰先生的《大话数据结构》是C语言版本的,小强只不过将C版本的程序在java版本中调通,然后把过程写下来。
希尔排序
1. 概念:
希尔排序(Shell Sort)是一种关于直接插入算法的一种优化排序。其基本思想是:先将整个数字序列分割成若干个子序列(由相隔某个增量的数据元素组成),分别对这些子序列进行直接插入排序,然后依次增减增量值再进行插入排序,待到整个序列基本有序(增量足够小)时,再对全体元素进行依次直接插入排序。
验证代码
publicclassJava_Sort {
public static void main(String[] args) {
int[] values={999,2,55,0,44,59,13,88,14,33};
System.out.print("排序前顺序为:");
for(int i=0;i<values.length;i++){
System.out.print(" "+values[i]);
}
ShellSort.shellsort1(values); //调用shellsort1排序算法时用
ShellSort.shellsort2(values);//调用shellsort2排序算法时用
System.out.print("\n");
System.out.print("排序后顺序为:");
for(int i=0;i<values.length;i++){
System.out.print(" "+values[i]);
}
}
}
2. 程序示例与讲解
1) 基本的shellsort排序算法
public static void shellsort1(int[] a){
int i,j,gap;
int Datalength=a.length;
//gap用于表示增量成都,这里每次的增量长度是上一次的一般
for(gap=Datalength/2;gap>0;gap/=2){
//其实也就是从第一个数据开始,位置相聚gap的数据组成一组,然后
//组内进行直接插入排序
for(i=0;i<gap;i++){
for(j=i+gap;j<Datalength;j+=gap){
if(a[j]<a[j-gap]){
int temp =a[j];
int k=j-gap;
while(k>=0&&a[k]>temp){
a[k+gap]=a[k];
k-=gap;
}
a[k+gap]=temp;
}
}
}
}
}
2) 另一种shell sort排序,这个排序算法其实跟shellsort1是一样的,只不过shellsort1是从前往后比较,而这个算法是从后往前比较。
public static void shellsort2(int[] a){
int i ,j;
int Datalength = a.length;
for(i=Datalength/2;i>0;i/=2){
for(j=i;j<Datalength;j++){
if(a[j]<a[j-i]){
int temp = a[j];
int k=j-i;
while(k>=0&&a[k]>temp){
a[k+i]=a[k];
k-=i;
}
a[k+i]=temp;
}
}
}
}
验证结果:
排序前顺序为: 999 2 55 13 44 59 0 88 14 33
排序后顺序为: 0 2 13 14 33 44 55 59 88 999
3) 图示说明