算法步骤

将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)

动图演示

insertionSort.gif

代码

  1. public class InsertSort {
  2. public int[] sort(int[] sourceArray) {
  3. // 对 arr 进行拷贝,不改变参数内容
  4. int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
  5. // 从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的
  6. for (int i = 1; i < arr.length; i++) {
  7. // 记录要插入的数据
  8. int tmp = arr[i];
  9. // 从已经排序的序列最右边的开始比较,找到比其小的数
  10. int j = i;
  11. while (j > 0 && tmp < arr[j - 1]) {
  12. arr[j] = arr[j - 1];
  13. j--;
  14. }
  15. // 存在比其小的数,插入
  16. if (j != i) {
  17. arr[j] = tmp;
  18. }
  19. }
  20. return arr;
  21. }
  22. }