图解排序 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 - 插入排序的主要内容,如果未能解决你的问题,请参考以下文章