排序算法-插入排序

0123456n
3042234512375
1. 基本思想

通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

用生活中的例子解释:

一队学生在操场,老师说,从矮到高排序

  1. 第一个前面没人,自然不用动,排好了;
  2. 第二个去看了一下第一个,发现比自己高,就站前面,比自己矮,就站后面,他说他跟第一个排好了;
  3. 第三个从他前面一个开始比,找到比自己矮的人,站他后面,都没有,就站第一位,他说他跟前两个排好了;
  4. 以此类推…
  5. 最后一个也是从他前面一个开始比,找到比自己矮的人,站他后面,都没有,就站第一位,他说全部排好了。

再来一个:整理扑克牌,将每一张牌插到其他已经有序的牌中适当的位置。

2. 详细分析

以从小到大排序为例

下面的例子没有学生例子直观,对比分析

  1. 第1轮:取出arr[1],current = arr[1],与arr[0]比较,如果current < arr[0],则将arr[0]往后移(arr[1] = arr[0]),并把current放最前面(arr[0] = current),否则把current放到arr[0]后面(arr[1] = current);

取出当前元素,做备份,前面的元素往后移时会覆盖后面的元素

  1. 第2轮:取出arr[2],current = arr[2],与arr[1]比较,如果current < arr[1],则将arr[1]往后移(arr[2] = arr[1]),再把current与arr[0]比较,如果current < arr[0],则将arr[0]往后移(arr[1] = arr[0]);过程中遇到current > arr[i]时,就终止比较,并把current放到arr[i]下一位(arr[i+1] = current);如果不遇到current > arr[i],则把current插入arr[0];

  2. 以此类推…

  3. 第n轮:取出arr[n],current = arr[n],与arr[n-1]比较,如果current < arr[n-1],则将arr[n-1]往后移(arr[n] = arr[n-1]),再把current与arr[n-2]比较,如果current < arr[n-2],则将arr[n-2]往后移(arr[n-1] = arr[n-2]);…;再把current与arr[0]比较,如果current < arr[0],则将arr[0]往后移(arr[1] = arr[0]);过程中遇到current > arr[i]时,就终止比较,并把current放到arr[i]下一位(arr[i+1] = current);如果不遇到current > arr[i],则把current插入arr[0];

注意:n = length - 1

3. 代码实现
public static void insertionSort(int[] arr) {
    // 外层循环,从第1轮到第n轮
    for (int n = 1; n <= arr.length - 1; n++) {
        // 取出当前元素
        int current = arr[n];
        // 从当前元素前一个开始比较
        int preIndex = n - 1;
        // 当全部比较完(preIndex < 0),或者当前元素不小于前面的元素时,退出循环
        while (preIndex >= 0 && current < arr[preIndex]) {
            // 后移
            swap(arr, preIndex, preIndex + 1);
            preIndex--;
        }
        // 并把current放到arr[i]下一位
        arr[preIndex+1] = current;
    }
}

preIndex >= 0 && current < arr[preIndex]这两判断条件的位置不能调换,当preIndex=0进入while循环后,preIndex–后为-1,arr[-1]会报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值