排序算法——直接插入排序算法的实现与改进

1、最优时间复杂度:o(n);
最差情况时间复杂度:o(n^2) ;
稳定排序算法;
2、算法核心:
(1)准确找到插入位置;
(2)将该位置之后的元素全部后移一位;
所以时间消耗在大量的数据移动上。
3、算法步骤:
(1)将第一个元素看作一个有序序列,而将第2个元素到最后一个元素看作未排序序列;
(2)从头到尾扫描未排序序列,将扫描到每个元素插入到合适的位置,直至排序结束。
4、优化策略
采用二分法快速找到插入位置。
5、未加二分法的插入排序算法实现的代码

/***************************************************************************
*  @file       main.c
*  @author     HAOJIEFENGLANG
*  @date       6  August 2018
*  @remark     6  August 2017
*  @theme      Insert sort
/***************************************************************************
#include
#include

void InsertSort(int a[], int n)
{
    int i, j, temp, count1, count2;
    temp = 0;
    count1 = count2 = 0;
    for (i = 1; i < n; i++)
    {
        count1++;
        if (a[i] < a[i - 1])
        {
            //找位置,同时把前面大于a[i]的值往后移动
            temp = a[i];
            for (j = i - 1; a[j] > temp; j--)
            {
                count2++;
                a[j + 1] = a[j];
            }
            a[j + 1] = temp;

        }
    }
    printf("比较次数%d,移动次数%d\n", count1, count2);
}
int main()
{
    int a[10] = { 1,0,2,3,4,5,6,7,8,9 };
    int n = 10;
    InsertSort(a, n);
    printf("插入排序后为:  ");
    for (int i = 0; i < n; i++)
        printf("%d ", a[i]);
    printf("\n");
    return 0;
}

你可能感兴趣的:(排序算法)