数据结构-插入排序

1、插入排序

它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

我们预留了一个哨兵,这里我们将用到它来保存一个临时值。插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,就是第一个元素。比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。

插入排序的算法步骤如下:

  1. 从第一个元素开始,该元素可以认为已经被排序;

  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描;

  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置;

  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;

  5. 将新元素插入到该位置后;

  6. 重复步骤2~5。

#include <stdio.h>
void InsertSort(int* p, int n)
{
    int temp,i,j;
    for (i = 0; i < n; i++)  //每个元素都需要来插入,故比较n次
    {
        temp = p[i];    //设置哨兵,为针对的第i个元素
        for (j = i - 1; (j >= 0) && (p[j] > temp); j--)  //将于哨兵前面的有序元素进行比较,如果要操作也仅仅是后移
        {
            p[j + 1] = p[j];
        }
        p[j + 1] = temp;   //for循环最后会--,所以待插入的位置为j+1
    }

}

int main()
{
    int a[] = { 4,2,5,6,7,8,3,1,9 };
    InsertSort(a,9);
    printf_s("排序后:\n");
    for (int i = 0; i < 9; i++)
    {
        printf_s("%d ", a[i]);
    }

    return 1;
}

空间上只需要一个记录辅助空间,所以关键看时间复杂度
平均比较和移动次数约为(n^2)/4,所以时间复杂度为O(n^2)。
其性能要比冒泡和简单选择排序好些

posted @ 2020-03-03 00:25  kkzhang  阅读(267)  评论(0编辑  收藏  举报