插入排序步骤:
以第1个数组元素为起点,构造有序数组,容量为1,后面无序数组元素依次加入前面有序数组,在插入中有序数组扩容,无序数组缩容。
以从小到达排列为例:
1.当后面无序数组第一个元素小于前面有序数组最大值,首先把需要插入的无序数组的值保存;
2.然后把前面有序数组的最大值复制到无序数组中需要插入的值中,相当于有序数组扩容一位;
3.之后有序数组倒数第二个值,循环和有序数组前面值比较,如果依旧小于前面的值,重复上个交换步骤;
4.否则,跳出循环,把第一步中保存的待插入值,赋值给数组的倒数第二个数;
5.上述是对无序数组的第一个索引值进行操作,遍历之。
从大到小反之。
代码示例如下:
// static int[] list = {7, 4, 2, 53, 3}; static int[] list = new int[100000]; static { for (int i = 0; i < list.length; i++) { list[i] = (int) (Math.random() * 8000000); } } public static void main(String[] args) { long l = System.currentTimeMillis(); for (int i = 1; i < list.length; i++) { int insertValue = list[i]; int insertIndex = i; while (insertIndex >= 1 && insertValue < list[insertIndex - 1]) { list[insertIndex] = list[insertIndex - 1]; insertIndex--; } if (insertValue != list[insertIndex]) { list[insertIndex] = insertValue; } // System.out.println("第" + i + "次数据交换"); } long s = System.currentTimeMillis(); System.out.println(s - l + "ms"); // System.out.println(Arrays.toString(list)); }
10w数据耗时0.9s。