8.17Java之插入排序(InsertionSort)算法

概念及介绍

  • 将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增 1 的有序表

假设前面 n-1(其中 n>=2)个数已经是排好顺序的,现将第 n 个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。

按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序。

实现方法: 使用双层循环

  1. 外层循环对除了第一个元素之外的所有元素

  2. 内层循环对当前元素前面有序表进行待插入位置查找,并进行移动

算法平均的时间复杂度和空间复杂度

平均时间复杂度:

o(n^2)

空间复杂度:

o(1)

情景:

  • 当待排序数组是有序时,是最优的情况,只需当前数跟前一个数比较一下,比较次数:N-1次,时间复杂度o(N)

  • 待排序数组是逆序的,时间复杂度:o(n^2)

引用四张图来说明这个排序算法:

8.17Java之插入排序(InsertionSort)算法_数组

8.17Java之插入排序(InsertionSort)算法_插入排序_02

8.17Java之插入排序(InsertionSort)算法_java_03

代码实现

package PracticeReview.Algorithm;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Scanner;

/**
* 插入排序练习
* @since JDK 1.8
* @date 2021/08/17
* @author Lucifer
*/
public class InsertSort {
   //定义一个数组
   private static int[] brr = new int[]{};
   //开始部分
   public static void sort(int[] arr){

       //记录传入数组的长度
       int n = arr.length;

       //第一层循环寻找位置进行比较-->不断循环到数组长度最后一位索引
       for (int i=0; i<n; i++){
           //内层循环开始寻找插入的值的位置--->依次和当前位置之前的值进行比较
           for (int j=i; j>0; j--){
               if ((arr[j]-arr[j-1])<0){
                   //调用换位方法
                   changePlace(arr, j, j-1);
              }else {
                   break;
              }
          }
      }

       for (int number : arr){
           System.out.println(number);
      }
  }

   //交换值位置的函数
   private static void changePlace(int[] arr, int i, int j){
       int t = arr[j];
       arr[j] = arr[i];
       arr[i] = t;
  }

   //获取键盘输入数组
   private static int[] getInputValue(){
       System.out.println("Input a string of number :");
       Scanner scanner = new Scanner(System.in);
       String input = scanner.next();

       Scanner scanner1 = new Scanner(System.in);
       System.out.println("Input int value :");
       String input2 = scanner1.next();

       String valueString = input + input2;

       //再将字符串转成成整型
       brr = new int[valueString.length()];

       try {
           for (