马士兵老师的希尔排序,有部分代码做了比较多无必要的计算,可以做如下的优化,见以下代码注释部分:
public class ShellSort {
public static void swap(int[] arr,int a,int b){
int temp=arr[a];
arr[a]=arr[b];
arr[b]=temp;
}
@Test
public void sort() {
int[] arr=new int[100];
for(int i=0;i<arr.length;i++){
arr[i]= (int) (Math.random() * 100000) % 100;
}
int c=0;
for(int gap=arr.length/2;gap>0;gap/=2){
for(int i=gap;i<arr.length;i++){
for(int j=i;j>gap-1;j-=gap){
if(arr[j]>arr[j-gap]){
swap(arr,j-gap,j);
}else{
/**
*
* 因前半截的序列都已经是有序的
* 所以,在出现了一次数据未交换的情况之后,就可以认为已经完成了排序
* 再往前比较也不会触发交换,因此应该 break
*/
break;
}
}
}
}
for(int n:arr){
System.out.print(n+",");
}
}
}