基本思想:
看图 ,觉得网上这张图特别形象。就是从牌堆里抓牌,比如先抓个3,在抓个7,在抓个9,在抓个4,把4插到3和7中间,这个时候3不动,后面的牌诺位置空出来给4,
其实挪动的话更像蜘蛛纸牌挪动,因为7不能先往后挪,不然会把后面的牌给覆盖。所以从后往前挪动,最后腾个位置插4。
书面一点:
把n个待排序的元素看成为一个有序表和一个无序表。开始时有序表中只包含1个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。
上代码:
public static void insertSort(int[] arr) { for(int i=1;i<arr.length;i++)//从第二个元素开始 { int nowdata=arr[i];//记录要插入的数值 int k=0; for( k=i-1; k>=0 && arr[k]> nowdata ;k-- ) { arr[k+1]=arr[k]; } arr[k+1]=nowdata;//赋值 } } public static void main(String[] args) { //int array[] = {4,2,1,5}; int[] array=new int[100_000]; for(int i=0;i<array.length;i++){//随机产生数据 array[i]=(int)(Math.random()*1000+1); } long startTime = System.currentTimeMillis(); //获取开始时间 insertSort(array); long endTime = System.currentTimeMillis(); //获取结束时间 System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间 }
看到了好几种写法,每种写法各有各的思路
在放一种参考的
public static void insertSort1(int[] nums) { int j; for(int i=1;i<nums.length;i++) { int temp = nums[i]; for(j=i;j>0;j--) { if(temp < nums[j-1]) { nums[j] = nums[j-1]; //将所有在nums[i]之前的大于nums[i]的值都往后移一位 } else break; } //移完所有大于nums[i]的值后,j刚好指向最靠前一个大于nums[i]的位置 nums[j] = temp; } }
总结:
插入排序最多十万级的数据,最好的应用场景是边读边排,不适合数据量太大的,太大的还是用快排。