数据结构与算法 - 插入排序

选择排序

插入排序的思想和我们打扑克摸牌的时候一样,从牌堆里一张一张摸起来的牌都是乱序的,我们会把摸起来的牌插入到左手中合适的位置,让左手中的牌时刻保持一个有序的状态。

那如果我们不是从牌堆里摸牌,而是左手里面初始化就是一堆乱牌呢? 一样的道理,我们把牌往手的右边挪一挪,把手的左边空出一点位置来,然后在乱牌中抽一张出来,插入到左边,再抽一张出来,插入到左边,再抽一张,插入到左边,每次插入都插入到左边合适的位置,时刻保持左边的牌是有序的,直到右边的牌抽完,则排序完毕。

image

数组初始化:[ 8,2,5,9,7 ],我们把数组中的数据分成两个区域,已排序区域和未排序区域,初始化的时候所有的数据都处在未排序区域中,已排序区域是空。

image

第一轮

第一轮,从未排序区域中随机拿出一个数字,既然是随机,那么我们就获取第一个,然后插入到已排序区域中,已排序区域是空,那么就不做比较,默认自身已经是有序的了。(当然了,第一轮在代码中是可以省略的,从下标为1的元素开始即可)

image

第二轮

第二轮,继续从未排序区域中拿出一个数,插入到已排序区域中,这个时候要遍历已排序区域中的数字挨个做比较,比大比小取决于你是想升序排还是想倒序排,这里排升序:

image

第三轮

第三轮,排 5 :

image

第四轮

第四轮,排 9 :

image

第五轮

第五轮,排 7

image

排序结束。

代码实现

void insertSort(vector<int>& nums) {
    for(int i = 1; i < nums.size(); i++) {
        int tmp = nums[i];
        for(int j = i; j > 0 && tmp < nums[j-1]; j--) {
            nums[j] = nums[j-1];
        }

        if(j != i) {
            arr[j] = tmp;
        }
    }
}

特点

稳定性:它是从后往前遍历已排序好的序列,相同元素不会改变位置,故为稳定排序;

空间复杂度:它是在原序列进行排序,故为 \(O(1)\);

时间复杂度:排序的过程中,首先要遍历所有的元素,然后在已排序序列中找到合适的位置并插入。共需要 2 层循环,故为 \(O(n^2)\);

posted @ 2021-12-24 15:57  Logan_Xu  阅读(29)  评论(0编辑  收藏  举报