插入排序:
算法思想:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
举例: 8 6 2 3 1 5 7 4
第一个与元素默认为排序好的,i 的范围 (i=1...n-1)
j 每次表示当前元素,j 的初始值为i,依次向前比较,是否比前一个数小,小的话,插入,否则不动。
第一次 i = 1,j = 1 6 和 8 比较 ,6比8小,将8后移, 6 填补上去 此时 6 8 2 3 1 5 7 4
第二次 i = 2, j = 2 2和 8比较,2比8小,8后移,此时为 6 8 8 3 1 5 7 4, j-1, 8比 6 大,不变,此时将2 填补上去。 6 2 8 3 1 5 7 4
第三次 i = 3,j =3 3 和 8比较 ,3比8 小 8后移 ,此时为 6 2 8 8 1 5 7 4 j-1 ,8比2 大 ,不变 ,此时再将3填补上去, 6 2 3 8 1 5 7 4. 以此类推
public void insertSort(Comparable[] arr){
int n = arr.length;
//默认第一个元素是已经拍好的
for (int i = 1; i <n;i++) {
//当前要考察的元素,是不是比他前面小,在插入, 当前位置
//写法一
/* for (int j = i;j >0;j--)
{
if((arr[j]).compareTo(arr[j-1])<0){
swap(arr,j,j-1);
}else{
break;
}*/
//写法二
Comparable e = arr[i];
int j = i;
for( ; j > 0 && arr[j-1].compareTo(e) > 0 ; j--)
arr[j] = arr[j-1];
arr[j] = e;
}
}
private void swap(Object arr[],int i,int j){
Object temp = arr[i];
arr[i] = arr[j];
arr[j] =temp;
}
public static void main(String [] arg){
SortHelper helper = new SortHelper();
Integer arr[] = {9,4,5,2,7,18,31,0,6,3};
InsertSort1 s1= new InsertSort1();
s1.insertSort(arr);
// double time2 = System.currentTimeMillis();
System.gc();
for (int i :arr) {
System.out.print(i +" ");
}
}