思想:由于插入和冒泡排序是交换相邻的两个逆序数,里面有多少个逆序对,就要交换多少次。有学者发现,如果不是交换相邻的逆序对,就可能一次交换能消灭几个逆序对,这样就可能提高效率。
//利用了插入排序的思想,对每一个子序列从宏观上看是进行插排,但在实际上操作时,并不是一次把每个子序列用插排好,更像并行的方式进行,但结果又不相互影响 public class shell_sort {
public static void main(String[] args) {
int a[]={1,7,3,9,0,4,5,6};
int b[]=a;
for(int i=0;i<a.length;i++)
System.out.print(a[i]+" ");
System.out.println();
insert_shell(a);
for(int i=0;i<a.length;i++)
System.out.print(a[i]+" ");
System.out.println();
}
public static void insert_shell(int a[]){
int n=a.length;
int temp;
//第一个for循环控制间隔
for(int i=n/2;i>0;i=i/2) {
//下面两个for是对插入排序的使用
//这个控制着位置,这个这个插排不是没一次循环就解决一个子序列的插排,
// 而是同时进行多个,当条件符合时才进行那个子序列,真好j++这个又能
//让整个所有自序列完成
for(int j=i;j<n;j++) {
temp = a[j];
int k;
for ( k = j; k >= i && temp < a[k - i]; k = k - i)
a[k] = a[k - i];
a[k] = temp;
}
}
}
}