插入排序

138 阅读1分钟

把n个待排序的元素看成是一个有序表和一个无序表,开始时有序表只包含一个元素,无序表中包含一个元素,无序表中包含(n-1)个元素。排序过程中,每次从无序表中取出第一个元素,将其与有序表的元素依次比较,将其插入到有序表中的适当位置,使之成为新的有序表。


	      R[0]  R[1]  R[2]  R[3]  R[4]  R[5]
初始状态:  (17)  3     25    14    20    9
第一次插入:(3    17)   25    14    20    9
第二次插入:(3    17    25)   14    20    9
第三次插入:(3    14    17    25)   20    9
第四次插入:(3    9     14    17    25)   20
第五次插入:(3    9     14    17    20    25)
public static void insertSort(int[] arr) 
{
	int insertVal = 0;
    int insertIndex = 0;
    //for循环简化代码
    for (int i = 1; i < arr.length; i++) 
    {
    	insertVal = arr[i];//定义插入的数
        insertIndex = i-1;//与前面的数比较
        //接下来给insertVal找到合适的插入位置
        //insertIndex >= 0, 保证给insertVal找到插入位置不越界
        //insertVal < arr[insertIndex],表明没有找到插入位置
        //此时需要将arr[insertIndex]后移
        while(insertIndex >= 0 && insertVal < arr[insertIndex]) 
        {
        	arr[insertIndex+1] = arr[insertIndex];
            insertIndex--;
        }
        //当推退出while循环时,表明找到了插入位置,insertIndex+1
        //判断是否需要赋值
        if (insertIndex+1 != i) 
        {
        	arr[insertIndex+1] = insertVal;
        }
    }
}