插入排序-算法

一、插入排序
1、插入排序类似玩扑克牌,摸牌的时候,摸到小的牌就和手中的牌比较,如果这张牌大于前面的牌则插入,否则的话继续和前面的牌比较,直到这张牌为第一张获取比前面牌大的时候,再继续摸牌。
2.为何只需要用摸到的这张牌和前面的牌比较?
是因为按照这样的逻辑,前面的牌已经都是排好序的,所以拿到新的牌只需要和比前面牌大即可插入
3.需要移动数组
因为是给定的数组,如果满足条件,需要在某个索引之后插入数据,那么需要将后面的数据进行移动。

比如:{2,1,4,5,6,3,4,2}1)假设摸到第一张牌为target = 2,那么从1开始,1 < 2,则将1放到第一个位置,2放到第二个位置。此时{1,2,4,5,6,3,4,2},此时设定第二个位置target = 2;
(2)那么新摸到牌为4,明显4 > 2,那么将target = 4,
(3)下次摸到55 > 4,将target = 5;
(4)下次摸到66 > 5,将target = 6;
(5)再下次摸到 3,此时需要注意:3 < target = 6,将6 往后移动一位,到达原来3 位置,再继续,3 < 5 ,将5往后移动一位,到达原来6的位置,再继续,3 < 4 ,将4往后移动一位,到达原来5的位置,再继续,3  > 2,此时ok了,说明需要将 3 插入到 2 的后面。以此类推。

二、代码实现

package com.daxiong.day3;

// 插入排序
public class InsertSort {

    public static void main(String[] args) {
        int[] data = { 44, 22, 2, 32, 54, 22, 88, 77, 99, 11 };
        insertSort(data);
    }

    public static void insertSort(int[] data){
        int i,j;
        int len = data.length;
        // 目标牌
        int target; 
        for(i = 1;i < len;i++){
            j = i;
            target = data[i];
            // 当目标值比前一个值小的话,向左持续移动
            while(j > 0 && target < data[j-1]){
                data[j] = data[j-1];
                j--;
            }
            // 当目标值比前一个值大的话,就把目标值设定该位置
            data[j] = target;
        }

        for(int m = 0; m < len;m++){
            System.out.print(data[m] + " ");
        }

    }

}
点赞