Java中的十大排序(二)直接插入排序

160 阅读2分钟

「这是我参与2022首次更文挑战的第8天,活动详情查看:2022首次更文挑战」。

前言

上一篇章我们讲了排序算法中用于评估算法的好坏的度量参数,本章我们要讲述直接插入排序。

image.png

直接插入排序分析

时间复杂度为 O(n^2) 时间复杂度最坏为 O(n^2) 时间复杂度最好为 O(n) 空间复杂度为O(1) 稳定性为稳定

分析上面度量参数可以发现直接插入的复杂度率高,但是它具有稳定性,并且空间复杂度属于合格。

直接插入排序

直接插入排序他的思路非常简单,经常被人们拿来使用扑克牌来做比喻,因为它的方法跟这个是一样的,比如你在斗地主,你需要把你的手牌进行理顺,首先你是不是要先定位一个值,然后根据这个值进行对比然后依次的进行排序,每次插入进去都是在一个有序队列中插入这样就会保证整个数组都是有序的,而这就是直接插入排序的思想。

假设序列有 private static int[] arr = {6, 5, 3, 2, 4};

第一步排序 5 6 3 2 4   //我们可以发现这里6和5进行了互换

第二步排序 3 5 6 2 4   // 这一步是3 与 5比较 与 6比较 做了两次比较,要跟前面的有序数列作比较,这样得到的结果才是有序的

第三步排序 2 3 5 6 4  // 同理 2与前面的有序数列 3 5 6 进行比较

第四步排序 2 3 4 5 6 // 4与整个有序队列进行对比,最后完成排序

代码实现

原理我们知道了接下来就是进行代码编写,把上面的思想带入到代码中去。

@Test
public void SISort(){
  // private static int[] arr = {6, 5, 3, 2, 4};

  for (int i = 1; i < arr.length; i++) {
    int temp = arr[i]; //arr第一个值

    int j = i; //i循环到哪里了

    //进行移位操作,给插入数据让位
    while (j>0){
      if (temp > arr[j - 1]) {
        arr[j] = arr[j - 1];
      }else {
        break;
      }
      j--;
    }

    //找到了该插入在哪里
    arr[j] = temp;

  }

  System.out.println(getArr(arr));

}