【算法】直接插入排序

目录

          • 1. 说明
          • 2. 举个例子
          • 3. java代码示例
          • 4. java示例截图

1. 说明
  • 1.直接插入排序的方式和打牌一样,刚开始数组为空
  • 2.拿到一个数字后从左到右将它与数组中的每一个数字进行比较,然后插入合适的位置
  • 3.到最后,数组按照既定的顺序排序好
2. 举个例子
  • 示例: [5, 3, 4, 1, 2]
  • 1. 获取数组的长度5,从第二个数开始循环操作
  • 2. 取下一个比较的值3,索引i为1,上一个索引j为0
  • 3.判断5是否大于3,则索引为1的数字改为5,得到 [5, 5, 4, 1, 2],j=j-1=-1,j<0跳出循环
  • 4.将索引0的位置的数字改为3,得到[3, 5, 4, 1, 2]
  • 5. 取下一个比较的值4,索引i为2,上一个索引j为1 (索引0到索引j都是有序的)
  • 6. 比较索引1位置的数字,5大于4,将索引2位置的数字改为5(往后挪一位),得到[3, 5, 5, 1, 2],j=j-1=0
  • 7. 比较索引0位置的数字,3小于4,跳出循环
  • 8. 将索引1位置的数字改为4,得到[3, 4, 5, 1, 2]
  • 9. 取下一个比较的值1,索引i为3,上一个索引j为2 (索引0到索引j都是有序的)
  • 10. 比较索引2位置的数字,5大于1,将索引3位置的数字改为5(往后挪一位),得到[3, 4, 5, 5, 2],j=j-1=1
  • 11. 比较索引1位置的数字,4大于1,将索引2位置的数字改为4(往后挪一位),得到[3, 4, 4, 5, 2],j=j-1=0
  • 12. 比较索引0位置的数字,3大于1,将索引1位置的数字改为3(往后挪一位),得到[3, 3, 4, 5, 2],j=j-1=-1,j<0跳出循环
  • 13. 将索引0位置的数字改为1,得到[1, 3, 4, 5, 2]
  • 14. 取下一个比较的值2,索引i为4,上一个索引j为3(索引0到索引j都是有序的)
  • 15. 比较索引3位置的数字,5大于2,将索引4位置的数字改为5(往后挪一位),得到[1, 3, 4, 5, 5],j=j-1=2
  • 16. 比较索引2位置的数字,4大于2,将索引3位置的数字改为4(往后挪一位),得到[1, 3, 4, 4, 5],j=j-1=1
  • 17. 比较索引1位置的数字,3大于2,将索引2位置的数字改为3(往后挪一位),得到[1, 3, 3, 4, 5],j=j-1=0
  • 18. 比较索引0位置的数字,1小于2,跳出循环
  • 19. 将索引1位置的数字改为2,得到[1, 2, 3, 4, 5]
3. java代码示例
package com.learning.algorithm.sort;

/**
 * 直接插入排序
 * 示例: 5, 3, 4, 1, 2
 * 1.获取数组的长度5,从第二个数开始循环操作
 * ===开始循环===
 * 2.取下一个比较的值3,索引i为1,上一个索引j为0
 * 3.判断5是否大于3,则索引为1的数字改为5,得到 [5, 5, 4, 1, 2],j=j-1=-1,j<0跳出循环
 * 4.将索引0的位置的数字改为3,得到[3, 5, 4, 1, 2]
 * ===继续循环===
 * 5.取下一个比较的值4,索引i为2,上一个索引j为1 (索引0到索引j都是有序的)
 * 6.比较索引1位置的数字,5大于4,将索引2位置的数字改为5(往后挪一位),得到[3, 5, 5, 1, 2],j=j-1=0
 * 7.比较索引0位置的数字,3小于4,跳出循环
 * 8.将索引1位置的数字改为4,得到[3, 4, 5, 1, 2]
 * ===继续循环===
 * 9.取下一个比较的值1,索引i为3,上一个索引j为2 (索引0到索引j都是有序的)
 * 10.比较索引2位置的数字,5大于1,将索引3位置的数字改为5(往后挪一位),得到[3, 4, 5, 5, 2],j=j-1=1
 * 11.比较索引1位置的数字,4大于1,将索引2位置的数字改为4(往后挪一位),得到[3, 4, 4, 5, 2],j=j-1=0
 * 12.比较索引0位置的数字,3大于1,将索引1位置的数字改为3(往后挪一位),得到[3, 3, 4, 5, 2],j=j-1=-1,j<0跳出循环
 * 13.将索引0位置的数字改为1,得到[1, 3, 4, 5, 2]
 * ===继续循环===
 * 14.取下一个比较的值2,索引i为4,上一个索引j为3(索引0到索引j都是有序的)
 * 15.比较索引3位置的数字,5大于2,将索引4位置的数字改为5(往后挪一位),得到[1, 3, 4, 5, 5],j=j-1=2
 * 16.比较索引2位置的数字,4大于2,将索引3位置的数字改为4(往后挪一位),得到[1, 3, 4, 4, 5],j=j-1=1
 * 17.比较索引1位置的数字,3大于2,将索引2位置的数字改为3(往后挪一位),得到[1, 3, 3, 4, 5],j=j-1=0
 * 18.比较索引0位置的数字,1小于2,跳出循环
 * 19.将索引1位置的数字改为2,得到[1, 2, 3, 4, 5]
 */
public class DirectInsertSort {
    public static void sort(int array[]) {
        // 获取数组的长度
        int length = array.length;
        // 从第二位开始比较
        for (int i = 1; i < length; ++i) {
            // 获取下一个比较的值
            int key = array[i];
            // 上一个索引
            int j = i - 1;

            // 比较到索引大于等于0的 且 遍历前面的值 与 key比较大小,如果比key大,大的值往后挪一位
            while (j >= 0 && array[j] > key) {
                // 比key大的值往后挪一位
                array[j + 1] = array[j];
                // 继续比较前面的值和key的大小
                j = j - 1;
            }
            // 当array[j]比key小,则array[j+1]的数字改为key
            array[j + 1] = key;
        }
    }

    /* A utility function to print array of size n*/
    public static void print(int[] array) {
        for (int i : array) {
            System.out.print(i + " ");
        }
    }

    public static void main(String args[]) {
        int array[] = {5, 3, 4, 1, 2};
        DirectInsertSort.sort(array);
        DirectInsertSort.print(array);
    }
}
4. java示例截图

在这里插入图片描述

你可能感兴趣的:(算法,算法)