zoukankan      html  css  js  c++  java
  • 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
    }

     

  • 相关阅读:
    Hdu 5396 Expression (区间Dp)
    Lightoj 1174
    codeforces 570 D. Tree Requests (dfs)
    codeforces 570 E. Pig and Palindromes (DP)
    Hdu 5385 The path
    Hdu 5384 Danganronpa (AC自动机模板)
    Hdu 5372 Segment Game (树状数组)
    Hdu 5379 Mahjong tree (dfs + 组合数)
    Hdu 5371 Hotaru's problem (manacher+枚举)
    Face The Right Way---hdu3276(开关问题)
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/15169308.html
Copyright © 2011-2022 走看看