• 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
    }

     

  • 相关阅读:
    vaddin使用技巧
    数据库连接&数据库进程&数据库操作
    gcc编译器参数使用及解决
    smtp服务器搭建(实现本地通讯)
    jdk+tomcat+mysql搭建网站无法打开
    ie8此加载项无法恢复&网站还原错误问题解决=lr成功打开ie成功录制脚
    loadrunner打不开ie&ie默认浏览器设置方法
    判断iis是否已经安装
    loadrunner常见问题
    代码中字符串比较长时可以分行写
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/15169308.html
Copyright © 2020-2023  润新知