概念及介绍
-
将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增 1 的有序表
假设前面 n-1(其中 n>=2)个数已经是排好顺序的,现将第 n 个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。
按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序。
实现方法: 使用双层循环
-
外层循环对除了第一个元素之外的所有元素
-
内层循环对当前元素前面有序表进行待插入位置查找,并进行移动
算法平均的时间复杂度和空间复杂度
平均时间复杂度:
o(n^2)
空间复杂度:
o(1)
情景:
-
当待排序数组是有序时,是最优的情况,只需当前数跟前一个数比较一下,比较次数:
N-1
次,时间复杂度o(N)
-
待排序数组是逆序的,时间复杂度:
o(n^2)
引用四张图来说明这个排序算法:
代码实现
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 (