思想:因爲插入和冒泡排序是交換相鄰的兩個逆序數,裏面有多少個逆序對,就要交換多少次。有學者發現,若是不是交換相鄰的逆序對,就可能一次交換能消滅幾個逆序對,這樣就可能提升效率。shell
//利用了插入排序的思想,對每個子序列從宏觀上看是進行插排,但在實際上操做時,並非一次把每一個子序列用插排好,更像並行的方式進行,但結果又不相互影響 public class shell_sort {code
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; } } }
}排序