实现过程与原理:
对于给定的几个数,先将第一个数看做有序序列,然后将第二个数插入到有序序列中,使整个序列再次有序化,再将第三个数插入到前面的有序序列中,如此往复,即为插入排序原理。
例:
现有给定几个数:21 39 18 16,请使用插入排序将它们从小到大排序
解:
21 39 18 16 现将21看作是有序序列,我们将39插入并排序
第一趟:将39插入
39大于21 故排序后:
21 39 18 16

第二趟: 21 39 18 16 前两个元素已经成为有序序列,我们将18插入并排序
18小于21且18小于39,故将39后移,再将21后移,并将18插入到第一个位置
排序后结果为:
18 21 39 16

第三趟:18 21 39 16 前三个元素已经成为了有序序列,这时我们将16插入并排序
16小于它们三者,故将39,21,18分别后移,第一个位置空出来给16,将16插入
排序后结果为:
16 18 21 39
到此为止,排序完毕
最后结果为:16 18 21 39

代码实现如下:

#include <stdio.h>

void InsertSort(int arr[], int m)
{
    for (int i = 1;i < m;i++)
    {
        int key = arr[i];
        while (arr[i - 1] > key)
        {
            arr[i] = arr[i - 1];
            i--;
            if (i == 0)
            {
                break;
            }
        }
        arr[i] = key;
    }
}

int main()
{
    int arr[6] = { 36,55,14,63,82,81 };
    InsertSort(arr,6);
    for (int i = 0;i < 6;i++)
    {
        printf_s("%d", arr[i]);
    }
}

时间复杂度:
最复杂的情况:刚好和我们要的结果排序相反:1+2+3+…+(m-1)=m*(m-1)/2 时间复杂度为O(n2)
最简单的情况:刚好和我们要的结果排序方式相同:n-1 时间复杂度为O(n)
平均时间复杂度:O(n2)

posted on 2021-11-11 11:46  LostDog  阅读(155)  评论(0)    收藏  举报