插入排序

插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。


代码实现:

#include
void print_sort_process(int src[],int length){
    printf("第%d趟排序:",length);
    int i = 0;
    for (i = 0; i < length; i++){
        printf("%d ", src[i]);
    }
    printf("\n");
}
void insert_sort(int src[],int length){
    int i,j,k,cur;
    for (i = 0; i < length; i++){

        cur = src[i];//src[i]为当前哨兵,复制当前哨兵
        for (j = i - 1; j >= 0; j--){//当前哨兵前面的有序集合
            if (cur >= src[j]){//从后往前找到哨兵应该插入的位置,等号保证排序稳定性
                break;//哨兵应该插入到j+1的位置
            }
        }

        for (k = i; k >= j+2; k--){//找到哨兵的插入位置后开始移动应被移动的元素
            src[k] = src[k-1];
        }
        src[j + 1] = cur;

        print_sort_process(src,i+1);//输出每趟排序的结果
    }
}
int main(){
    int i = 0;
    int a[8] = {49,38,65,97,76,13,27,49};
    printf("\n\n**************************************\n\n插入排序前:");
    for (i = 0; i < 8; i++){
        printf("%d ", a[i]);
    }
    printf("\n\n**************************************\n\n");

    insert_sort(a, 8);//开始进行插入排序
}

运行结果:

插入排序_第1张图片


时间复杂度:

最优:最好的情况就是序列已经排好序,当遍历每一个哨兵找到它应该插入的位置其实就是它原来的位置,不需要移动元素的位置,时间复杂度为O(n)。

最差:最差的情况就是本想将序列从小到大排,但是序列原本的顺序是从大到小。这样每当遍历一个哨兵找到他应该插入的位置后,都要再执行一个循环进行元素移动,移动量分别为1,2,3,….n-1。因此时间复杂度为O(n平方)。

平均:O(n平方)。


除此之外,插入算法还是稳定的排序算法,关于稳定排序算法的定义,可以查看百度百科:http://baike.baidu.com/link?url=FDflW5s0bIr2aSxL_33bgHkVvzMbEM_7GHQ_sH4wgo6AthkXCIYGleYd40-82V1JY9edgsuVsL2quEX4h0L8cK


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