图解排序 2/10 - 插入排序

Posted 超越技术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图解排序 2/10 - 插入排序相关的知识,希望对你有一定的参考价值。

这是图解排序的第 2 篇。选择排序的核心思想是把一个待排序序列,分成 2 部分,前半部分为有序序列,后半部分为无序序列,遍历后半部分数据,插入到前半部分已经排序好的序列,最终得到一个有序序列。

插入排序

在整个排序过程如图所示,以 arr = [ 8, 1, 4, 6, 2, 3, 5, 7] 为例,它会把 arr 分成两组 A = [ 8 ] 和 B = [ 1, 4, 6, 2, 3, 5, 7] ,逐步遍历 B 中元素插入到 A 中,最终构成一个有序序列:

代码实现:



+ (NSArray *)insertionSort:(NSArray *)unsortDatas {    NSMutableArray *unSortArray = [unsortDatas mutableCopy]; int preindx = 0; NSNumber *current; for (int i = 1; i < unSortArray.count; i++) { preindx = i - 1; // 必须记录这个元素,不然会被覆盖掉 current = unSortArray[i]; // 逆序遍历已经排序好的数组
// 当前元素小于排序好的元素,就移动到下一个位置 while (preindx >= 0 && [current integerValue] < [unSortArray[preindx] integerValue] ) { // 元素向后移动 unSortArray[preindx+1] = unSortArray[preindx]; preindx -= 1; } // 找到合适的位置,把当前的元素插入 unSortArray[preindx+1] = current; } return [unSortArray copy];}


特点

稳定性:它是从后往前遍历已排序好的序列,相同元素不会改变位置,故为稳定排序;
空间复杂度:它是在原序列进行排序,故为 O ( 1 );

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


感想

插入排序的特点是把一个序列分成 2 组,开始的时候把第1个元素作为一组(有序),剩余元素作为另一组(无序)。这种方式如同打扑克,每次抓取一张牌插入到手里已经排序好的牌中。这种排序方式更适合某个序列本身已经有序或基本有序,插入几个元素。想优化这种排序可以在查找插入位置的时候选择一种更高效的算法,比如折半查找。



推荐阅读:



探索技术之外的生活



以上是关于图解排序 2/10 - 插入排序的主要内容,如果未能解决你的问题,请参考以下文章

图解排序算法-插入排序

基础排序算法总结(代码+图片分析)

希尔排序图解与代码

图解排序算法:希尔排序

八大排序算法C语言过程图解+代码实现(插入,希尔,选择,堆排,冒泡,快排,归并,计数)

scratch图解排序算法:插入排序冒泡排序选择排序归并排序快速排序堆排序