vlambda博客
学习文章列表

排序算法视频版 | 直接插入排序

前面介绍了已经介绍了三种排序,暴力排序、冒泡排序和简单选择排序,一个共同点都是基于交换。

我们可以用另一种视角来看待排序,即将一个待排序的数组看成两个部分:有序区和乱序区。

在排序开始前,整个数组都是乱序区,而有序区则为空:

排序开始后,有序区逐渐扩大,乱序区逐渐缩小:

排序算法视频版 | 直接插入排序

排序完成后,整个数组都是有序区,乱序区则为空:

排序算法视频版 | 直接插入排序

核心思想:将数组看作无序区和有序区两个区,从无序区中选出一个元素,按大小插入到有序区的合适位置。当无序区为空时,有序区自然就完成排序了。

动态过程如下:

代码实现如下:

/*
 * 直接插入排序
 * array : 数组
 * length : 数组长度 
 */

void straight_insertion_sort(int *arrayint length)
{
    int i, j;
    // 外层循环 决定待插入值
    for (i = 1; i < length; i++) {
        if (array[i] < array[i - 1]) {
            int tmp = array[i]; // 待插入值
            // 内层循环 在有序区中为待插入值腾出位置
            for (j = i - 1; j >= 0 && array[j] > tmp; j--) {
                array[j + 1] = array[j];
            }
            array[j + 1] = tmp; // 插入
        }
    }
}

请注意插入元素到有序区的关键代码 array[j + 1] = tmp;中的 j+1

以上就是直接插入排序的基本原理。

完整代码请移步至 GitHub[1] | Gitee[2] 获取。

如有错误,还请指正。

推荐阅读

参考资料

[1]

GitHub: https://github.com/xingrenguanxue/Simple-DS-and-Easy-Algo

[2]

Gitee: https://gitee.com/xingrenguanxue/Simple-DS-and-Easy-Algo