插入排序

思想:

对于给定的一组记录,初始时假定第一个记录自成一个有序序列,其余的记录为无序序列;接着将第二个记录插入之前的有序序列中;以此类推。

核心思想在于找到要插入的位置。就像抓牌一样,新的牌要插到哪儿才是核心。

代码:

#include <stdio.h>

int InsertSort(int *array, int len)
{
    if (array == NULL || len <= 0)
        return -1;
    int i, j;
    int temp; //保存要插入的值
    for (i = 1; i < len; i++)  //这里从1号元素开始插入,因为默认为0号元素是有序的
    {
        temp = array[i]; //先把要插入的值保存下来,后面会覆盖
        //由后向前遍历,找插入位置。核心
        for (j = i - 1; j >= 0; j--) //这里注意 j 的条件  i号元素前的以序列为 0~i-1
        {
            if (temp < array[j])
                array[j + 1] = temp;   //此时 array[i]已经变化了,被覆盖所以要用辅助变量 temp
            else
                break; //找到了插入位置在 j 的后面
        }
        array[j + 1] = temp;  //插入
    }
    return 0;
}

int main()
{
    int i;
    int array[] = { 9,2, 5, 3, 5, 7, 6, 8 };
    int len = sizeof(array) / sizeof(int);
    InsertSort(array, len);
    for (i = 0; i < len; i++)
    {
        printf("%d\n", array[i]);
    }
    getchar();

}

 

插入排序法的时间复杂度为 O(n²)。

插入排序法是稳定的:插入过程中,遇到与插入元素相等的,会放在其后面。所以并没改变他们的相对位置。

 

posted @ 2017-03-27 17:00  ren_zhg1992  阅读(86)  评论(0)    收藏  举报