当前位置 博文首页 > 用心编码:插入排序-算法

    用心编码:插入排序-算法

    作者:[db:作者] 时间:2021-09-07 13:30

    一、插入排序
    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] + " ");
            }
    
        }
    
    }
    
    cs
    下一篇:没有了