思路:
1.i从0开始,j从i+1开始,j往前比较如果比他大(小)交换,直到不能交换为止,说明找到了插入位置,一次遍历完成。
public class InsertSort { // 直接插入排序: // 将当前数插入到已有的数组中,使之有序: // j从i+1开始往前直到找到一个比他大(小)的数为止,一直交换 @Test public void test(){ int[] a = {1,2,5,8,3,4,6,9,7}; sort(a); System.out.println(Arrays.toString(a)); } public void sort(int[] a){ for(int i=0; i<a.length-1; i++){ for(int j=i+1; j>0; j--){ if(a[j] < a[j-1]){ a[j] += a[j-1]; a[j-1] = a[j] - a[j-1]; a[j] -= a[j-1]; }else{ break; } } } } }
当使用多步长时变为希尔排序:
public void xierSort(int[] a){ int h=1; // 确定步长 while(h<a.length/3){ h = 3*h+1; } for(;h>=1;h/=3){ for(int i=0; i<a.length-h; i+=h){ for(int j=i+h; j>0; j-=h){ if(a[j] < a[j-h]){ a[j] += a[j-h]; a[j-h] = a[j] - a[j-h]; a[j] -= a[j-h]; }else{ break; } } } } }