插入排序

插入排序

举例说明

       接下来的例子是把数组A从小到大使用插入排序的方法进行排序。

       A={5,8,3,9,6,5}

       第一步:5,8,3,9,6,5                //8做为key和5比较,8比5大所以

                                                                      8和5不用换位置。

       第二步:5,8,3,9,6,5                //3做为key。先和8比较,3比8小,

                                                               因此8和3换位置。当前序列为

                                                               5,3,8,9,6,5。3继续和左边的5作比较,

                                                               3比5小,因此3和5交换位置。当

                                                               前序列为3,5,8,9,6,5。

       第三步:3,5,8,9,6,5                //key的位置移动到9的位置了。9和

                                                               8比,9比8大。因此,这次执行不需

                                                               要换位置。

       第四步:3,5,8,9,6,5                //key的位置移动到6的位置了。6和

                                                               9比,9比6大。因此,9和6交换位

                                                               置要换位置。当前序列为3,5,8,6,9,5.

                                                               6继续和8比较,6比8小。所以6和

                                                               8换位置。当前序列为3,5,6,8,9,5.

 

       第五步:3,5,6,8,9,               //key的位置移动到5的位置了。5和

                                                               9比,9比5大。因此,9和5交换位

                                                               置要换位置。当前序列为3,5,6,8,5,9.

                                                               8继续和5比较,5比8小。所以5和

                                                               8换位置。当前序列为3,5,6,5,8,9。5

                                                               继续跟6比较,比6小。因此5和6

                                                               换位置。当前序列为3,5,5,6,8,9。5和

                                                               5比较,比不出大小了。所以本次比

                                                               较到此结束。

       当前序列为3,5,5,6,8,9。序列已经遍历完了,因此最终的排序结果为3,5,5,6,8,9。

 

 

算法分析

 接下来我们分析算法的时间复杂度。

伪代码

我们假定第i行执行的时间是C i。



求和时间T(n)


 

算法时间分析

       接下来我们来分析,最好和最坏情况下,插入排序所用的时间。假设我们的排序都是从小到大进行排序(当然也可以从大到小进行排序)。

 

最好情况

       最好的情况指已经排好序的情况下。第4行运行的次数为n-1次。

       所以T(n)= C1*(n-1)+ C2*(n-1) + C3*(n-1)+ C4*(n-1)+C7*(n-1),从该函数可以看出来,T(n) 为线性函数。

 

最坏情况


实现及测试

#include<stdio.h>

 

voidinsert_sort(int *a,int count){

        for(int i=1;i<count;++i){

                int key = a[i];

                int j = i-1;

                while((j>=0)&&(a[j]>key)){

                        a[j+1] = a[j];

                        j--;

                }

                a[j+1]= key;

        }

}

 

int main(){

 

        int a[10]={1,4,5,2,7,80,12,7,8,10};

        for(int i = 0;i<10;++i){

                printf("%d ",a[i]);

        }

        insert_sort(a,10);

        printf("\n");

        for(int i = 0;i<10;++i){

                printf("%d ,",a[i]);

        }

}


总结

       在实践中,我们真正感兴趣是运行时间的增长率或增长量级。所以我们只考虑公式中最重要的项(比如),当n很大时,低阶项相对来说已经不是很重要了。因此插入排序的最差时间复杂度为.

参考资料

《算法导论》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值