插入排序

主要是哨兵的作用,把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
原文地址:https://www.cnblogs.com/kkshaq/p/4516707.html