插入排序

来源:互联网 发布:python dict items 编辑:程序博客网 时间:2024/06/06 06:40

插入排序

通常人们整理卡牌的方法是一张一张的来,将一张卡牌插入到其他已经有序的牌中适当的位置。在计算机的实现过程中,为了给插入的元素腾出空间,我们需要将其余的所有元素在插入之前都向右移动一位。这种算法叫插入算法。接下来将介绍两种插入排序,分别是直接插入排序和希尔排序。

直接插入排序

直接插入排序是一种简单的排序方法,通过将一个记录插入到一个有序列表中,得到一个新的有序表。

直接插入排序思路

假设待排序的记录存放在数组 R[1..n]中。初始时,R[1]自成 1 个有序区,无序区为 R[2..n]。从 i=2 起直至 i=n 为止,依次将 R[i] 插入当前的有序区 R[1..i-1] 中,生成含 n 个记录的有序区。

直接插入排序运行过程

这里写图片描述

直接插入排序代码

- (void)straightInsertionSort:(NSMutableArray *)array {    if (array.count == 0) {        return;    }    for (int i = 1; i < array.count; i ++) {        if (array[i] < array[i - 1]) {           // 避免移动数据过程中将数据弄丢,将要排序的数据存储为临时变量            float target = [array[i] floatValue];            int j = i - 1 ;            // 目标数据需要移动,前方有序数据依次向后移动,同时通过j>0保证数组不发生越界            while (target < [array[j] floatValue] && j > 0) {                [array exchangeObjectAtIndex:j + 1 withObjectAtIndex:j];                j --;            };            // 将数据插入正确位置            array[j] = @(target);        }    }}

性能(算法时间、空间复杂度、稳定性)分析

  1. 时间复杂度

    当原始序列“正序”排列时,直接插入排序总的比较次数为n-1,移动次数为0,也就是说直接插入排序在最好情况下的时间复杂度为O(n);

    当原始序列“逆序”排序时,直接插入排序总的比较次数为最外成for循环执行次数1+2+3+n- 1=(n-1)n/2,移动次数为2+3+…n=(n-1)(n+2)/2次,所以直接插入排序在最坏情况下的时间复杂度为O(n^2);

  2. 空间复杂度

    直接插入排序过程中需要一个临时变量进行两两交换,所需要的额外空间为2n,因此空间复杂度为O(n)。

  3. 稳定性

    直接插入排序在排序过程中,元素两两交换时,相同元素的前后顺序并没有改变,所以直接插入排序是一种稳定排序算法。

原创粉丝点击