插入排序
主要是哨兵的作用,把arr[0]位置作为哨兵,哨兵有两个作用:
1.是保存待插入的元素,相当于temp的作用,因为每次比较,都会移位,后面的元素的值都会被前面的覆盖
2.用于监视,是否数组越界,j=0时,a[j]=a[0],此时会跳出for循环。用于监视数组越界,若不使用哨兵a[0],则每次循环都要判断j>0,若不判断,会数组越界。(这里都是假设数组从下标1开始)
void Insert_sort(int a[],int length){ for(iny i=2;i<l=length;i++){ a[0]=a[i]; if(a[i]<a[i-1]){ //有比较的必要,也可以不判断,下面的for可以帮忙断 for(int j=i-1;a[j]>a[0];j--) a[j+1]=a[j]; a[j+1]=a[0]; //for之后,比较结束,插入待排序数 } }
//无哨兵的版本 public static void sort2(int[] arr) { int length = arr.length; for (int i = 1; i < length; i++) { if (arr[i] < arr[i - 1]) { int temp = arr[i]; int j; for (j = i - 1; j >= 0 && temp < arr[j]; j--) { arr[j + 1] = arr[j]; } arr[j + 1] = temp; } } } //可以看见j>0&&temp<arr[j],需要不断的判断j>0