[Day17] CH10:排序大家族——插入排序法

今天第三天要登场的是插入排序法(Insertion Sort),我自己在玩扑克牌的时候,都是使用这种排序,不知道你们是不是也是呢?

插入排序法

将资料分成已排序与未排序,由未排序的第一笔资料开始,插入到已排序资料的适当位置,插入时由後至前比较,直到遇到比当前资料 (temp) 小的值再插入,比较时若遇到比 temp 大或相等,则往後移。

给定一个阵列:

41, 24, 97,  6, 19, 53, 78

首先,24 比 41 小插入到 41 前

24, 41, 97,  6, 19, 53, 78

接下来 97 比 41 大,插入 41 後面

24, 41, 97,  6, 19, 53, 78

再来,6 比 24 小,插入到 24 前

 6, 24, 41, 97, 19, 53, 78

以此类推,最後 78 插入完就完成排序,以下是动图与程序法:

插入排序法动图

public class InsertionSort {
    public static void main(String[] args){
        int[] arr = {41, 24, 97, 6, 19, 53, 78};
        int n = arr.length;
        for(int i = 1 ; i < n ; i++){
            int temp = arr[i];
            int j = i-1;
            while(j >= 0 && arr[j] > temp){ //持续比对是否比 temp 大
                arr[j+1] = arr[j];
                j--;
            }
            arr[j+1] = temp;
        }
        for(int i = 0 ; i < n ; i++){
            System.out.printf("%d ", arr[i]);
        }
    }
}

时间复杂度

在最佳的情况下,也就是一开始便由小到大排序,因此只需走过阵列长度的次数,每一次只需 1 个步骤(都不需移动),时间复杂度为 O(n)。而在最坏的情况,阵列一开始由大到小排序,每一次需要 i 个步骤,总共会需要和选择排序法一样的 n * (n + 3) / 2,时间复杂度为 O(https://chart.googleapis.com/chart?cht=tx&chl=n%5E2)。平均的话,每一次会需要比较 n / 2 个数字,总共 n 次,所以时间复杂度一样为 O(https://chart.googleapis.com/chart?cht=tx&chl=n%5E2)。

学了3天那我们先来整理一下三个排序法吧:

演算法 Best Case Worst Case Average Case
气泡排序法 O(n) O(https://chart.googleapis.com/chart?cht=tx&chl=n%5E2) O(https://chart.googleapis.com/chart?cht=tx&chl=n%5E2)
选择排序法 O(https://chart.googleapis.com/chart?cht=tx&chl=n%5E2) O(https://chart.googleapis.com/chart?cht=tx&chl=n%5E2) O(https://chart.googleapis.com/chart?cht=tx&chl=n%5E2)
插入排序法 O(n) O(https://chart.googleapis.com/chart?cht=tx&chl=n%5E2) O(https://chart.googleapis.com/chart?cht=tx&chl=n%5E2)

怎麽平均都是 O(https://chart.googleapis.com/chart?cht=tx&chl=n%5E2) 呢?难道不能再快一点吗?明天我们会介绍这个单元的最後一个演算法,一起来期待看看吧!


<<:  再来说说物理结构(储存结构) - DAY 3

>>:  [D02] 数位影像的基本介绍(2)

Day23:传入 JSON 文件

前言 上一篇文章我 hard code 了一些数据进去我的专案, 现在要来把这些数据放进 JSON ...

Day25 实作MiddleWare(2)

昨天跟大家介绍完middleware的基本建立後,大家有没有理解并成功做出来呢! 如果对於这部分还有...

LeetCode解题 Day05

899. Orderly Queue https://leetcode.com/problems/o...

【Day17】[资料结构]-堆积Heap

堆积(Heap)是一种特别的完全二元树,又分为最小堆积(Min-Heap)、最大堆积(Max-Hea...

[Day4]专案始动-续(後端篇)

今天就直接来设定一下MongoDB以及Spring专案的架构,昨天有提到MongoDB是使用Dock...