怎样理解插入排序

插入排序,把数组从第一个元素开始,每往后一个,将后一个元素插入到前面,使得前面的是序的.

给定无序数组如下:

把数组的首元素5作为有序区,此时有序区只有这一个元素:

第一轮

让元素8和有序区的元素依次比较。

8>5,所以元素8和元素5无需交换。

此时有序区的元素增加到两个:

第二轮

让元素6和有序区的元素依次比较。

6<8,所以把元素6和元素8进行交换:

6>5,所以把元素6和元素5无需交换。

此时有序区的元素增加到三个:

第三轮

让元素3和有序区的元素依次比较。

3<8,所以把元素3和元素8进行交换:

3<6,所以把元素3和元素6进行交换:

3<5,所以把元素3和元素5进行交换:

 

此时有序区的元素增加到四个:

以此类推,插入排序一共会进行(数组长度-1)轮,每一轮的结果如下:

package sort.insert;

import java.util.Arrays;

/**
 * @description: 插入排序
 * @author:tao
 * @create: 2019-12-27 17:48
 */
public class InsertSort {

    public static void main(String[] args) {
        int []array = {5, 8, 6, 3, 9, 2, 1, 7};
        System.out.println("原数组:" + Arrays.toString(array));
        insertSort(array);
        System.out.println("排序数组:" + Arrays.toString(array));
    }

    private static void insertSort(int []array) {

        int forTimes = 0;
        int swapTimes = 0;

        for (int i = 0; i < array.length-1; i++) {

            int j = i + 1;
            // 每次插入的元素
            int insertValue = array[j];
            boolean isSwap = false;
            for ( ; j > 0 && insertValue < array[j-1]; j--) {
                // (比insertValue大的值)平行移动
                forTimes++;
                swapTimes++;
                array[j] = array[j-1];
                isSwap = true;
            }
            if (isSwap) {
                // 找到插入位置
                array[j] = insertValue;
            }
            System.out.println("第" + i + "轮," + Arrays.toString(array) + ",插入元素是array["+ (i+1) +"]=" + insertValue + ", 插入位置是:array.index=" + j);
        }
        System.out.println("循环次数forTimes = " + forTimes);
        System.out.println("发生交换次数swapTimes = " + swapTimes);
    }
}

原数组:[5, 8, 6, 3, 9, 2, 1, 7]
第0轮,[5, 8, 6, 3, 9, 2, 1, 7],插入元素是array[1]=8, 插入位置是:array.index=1
第1轮,[5, 6, 8, 3, 9, 2, 1, 7],插入元素是array[2]=6, 插入位置是:array.index=1
第2轮,[3, 5, 6, 8, 9, 2, 1, 7],插入元素是array[3]=3, 插入位置是:array.index=0
第3轮,[3, 5, 6, 8, 9, 2, 1, 7],插入元素是array[4]=9, 插入位置是:array.index=4
第4轮,[2, 3, 5, 6, 8, 9, 1, 7],插入元素是array[5]=2, 插入位置是:array.index=0
第5轮,[1, 2, 3, 5, 6, 8, 9, 7],插入元素是array[6]=1, 插入位置是:array.index=0
第6轮,[1, 2, 3, 5, 6, 7, 8, 9],插入元素是array[7]=7, 插入位置是:array.index=5
循环次数forTimes = 17
发生交换次数swapTimes = 17
排序数组:[1, 2, 3, 5, 6, 7, 8, 9]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值