用户登录
用户注册

分享至

插入排序算法图文详解

  • 作者: 薇老大
  • 来源: 51数据库
  • 2022-09-23

插入排序是一种非常简单的排序算法,它可以对序列完成升序(由小到大)或降序(由大到小)排序。

插入排序算法的核心思想是:始终维护一个有序的子序列,并不断将其它待排序的元素插入到这个有序序列中,直至该序列包含所有待排序的元素。

插入排序算法并不适用于对大型数据集进行排序,其平均时间复杂度为O(n2)

插入排序算法的基本原理

我们以如下待排序的序列为例,给您描述使用插入排序算法进行升序排序的整个过程。


1) 首先,我们默认第 1 个元素 14 为一个有序的子序列,依次将剩余元素插入到该序列中。


2) 比较 33 和 14 的大小,14 < 33,符合升序排序的规则,因此有序子序列变为 {14,33}。


3) 比较 33 和 27 的大小,33 > 27,不符合升序排序的规则,27 应插入到 14 和 33 中间,有序子序列变为 {14,27,33}。


4) 比较 33 和 10 的大小,33 > 10,不符合升序排序的规则,10 应插入到 14 前面,有序子序列变为 {10,14,27,33}。


5) 比较 33 和 35 的大小,33 < 35,符合升序排序的规则,有序自序列变为 {10,14,27,33,35}。


6) 比较 35 和 19 的大小,35 > 19,不符合升序排序的规则,19 应插入到 14 和 27 之间,有序子序列变为 {10,14,19,27,33,35}。


7) 比较 35 和 42 的大小,35 < 42,符合升序排序的规则,有序子序列变为 {10,14,19,27,33,35,42}。


8) 比较 42 和 44 的大小,42 < 44,符合升序排序的规则,有序子序列变为 {10,14,19,27,33,35,42,44}。


由此,我们就得到了 {10,14,19,27,33,35,42,44} 这个升序序列。

插入排序算法的具体实现

如下为实现插入排序算法的伪代码:

// list 为待排序序列
insertion_sort(list):
    // 从第 2 个元素开始遍历序列
    for i <- 2 to length(list):
        //记录要插入的目标元素
        insert_elem = list[i]
        //记录目标元素所在的位置
        position = i
        //从 position 所在位置向前遍历,直至找到一个比目标元素小的元素,目标元素插入到该元素之后的位置
        while position > 0 and list[position-1] > insert_elem:      // 此为升序排序,实现降序排序改为 list[position-1] < insert_elem
            //移动前一个元素的位置,将其向后移动一个位置
            list[position] = list[position-1]
            position = position - 1
        if(position != i):
            list[position] = insert_elem
    return list


如下是用插入排序算法对 {10,14,19,27,33,35,42,44} 进行升序排序的 C 语言程序:

#include <stdio.h>
#define MAX 8   //设定待排序序列中的元素个数
//list[MAX]为待排序序列
void insertion_sort(int list[MAX]) {
    int insert_elem;
    int position;
    int i;

    //从第 2 个元素(下标为 1)开始遍历
    for (i = 1; i < MAX; i++) {
        // 记录要插入的目标元素
        insert_elem = list[i];
        // 记录目标元素所在的位置,从此位置向前开始遍历
        position = i;

        // 从 position 向前遍历,找到目标元素的插入位置
        while (position > 0 && list[position - 1] > insert_elem) {
            //position 处的元素向后移动一个位置
            list[position] = list[position - 1];
            position--;
        }
        //将目标元素插入到指定的位置
        if (position != i) {
            list[position] = insert_elem;
        }
    }
}

int main() {
    int list[MAX] = { 10,14,19,27,33,35,42,44 };
    insertion_sort(list);
    //输出 list 数组中已排好序的序列
    for (int i = 0; i < MAX; i++) {
        printf("%d ", list[i]);
    }
}


如下是用插入排序算法对 {10,14,19,27,33,35,42,44} 进行升序排序的 Java 程序:

public class Demo {
    public static void insertion_sort(int[] list) {
        int length = list.length;
        // 从第 2 个元素(下标为 1)开始遍历
        for (int i = 1; i < length; i++) {
            // 记录要插入的目标元素
            int insert_elem = list[i];
            // 记录目标元素所在的位置,从此位置向前开始遍历
            int position = i;
            // 从 position 向前遍历,找到目标元素的插入位置
            while (position > 0 && list[position - 1] > insert_elem) {
                // position 处的元素向后移动一个位置
                list[position] = list[position - 1];
                position--;
            }
            // 将目标元素插入到指定的位置
            if (position != i) {
                list[position] = insert_elem;
            }
        }
    }

    public static void main(String[] args) {
        int[] list = { 10, 14, 19, 27, 33, 35, 42, 44 };
        insertion_sort(list);
        // 输出已排好序的序列
        for (int i = 0; i < list.length; i++) {
            System.out.print(list[i] + " ");
        }
    }
}


如下是用插入排序算法对 {10,14,19,27,33,35,42,44} 进行升序排序的 Python 程序:

#待排序序列
list = [10, 14, 19, 27, 33, 35, 42, 44]
def insertion_sort():
    length = len(list)
    # 从第 2 个元素(下标为 1)开始遍历
    for i in range(1,length):
        # 记录要插入的目标元素
        insert_elem = list[i];
        # 记录目标元素所在的位置,从此位置向前开始遍历
        position = i
        # 从 position 向前遍历,找到目标元素的插入位置
        while position > i and list[position - 1] > insert_elem:
            # position 处的元素向后移动一个位置
            list[position] = list[position - 1]
            position = position - 1
        # 将目标元素插入到指定的位置
        if position != i:
            list[position] = insert_elem

insertion_sort()
# 输出已排好序的序列
for i in list:
    print(i,end=" ")


以上程序的输出结果均为:

10 14 19 27 33 35 42 44 


软件
前端设计
程序设计
Java相关