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

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

概念及介绍

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

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

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

实现方法: 使用双层循环

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

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

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

平均时间复杂度:

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 (int j=0; j<valueString.length(); j++){
               //将输入的字符串转成整数
               brr[j] = Integer.parseInt(valueString.substring(j, j+1));
               /*
               substring是找出包含起始位置,不包含结束位置,到结束位置的前一位的子串
                */
          }
      }catch (Exception e){
           System.out.println("输入值的时候发生异常!!!");
           System.out.println(e.getMessage());
           e.printStackTrace();
      }
       return brr;
  }
}

go复现

package main

var (
n int
)

func insertSort(arr []int) {
n = len(arr)

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

func changePlace(brr []int, k int, l int) {
temp := brr[l]
brr[l] = brr[k]
brr[k] = temp
}

 

原文地址:https://www.cnblogs.com/JunkingBoy/p/15169308.html