linxihuanghuang

导航

插入排序的算法分析

#include<iostream>
using namespace std;
void insert_sort_function(int array[],int size)
{
    int key;                                          //总次数                                      单位时间
    for(int i=1, j;i!=size;++i)                       //n                                            c1
    {
        
        if(array[i]<array[i-1])                      //n-1                                           c2
        {
            key=array[i];                            //n-1                                           c3
            j=i-1;                                   //n-1                                           c4
            do{
                array[j+1]=array[j];                //Σt(i),i=2,3…n,t(i)为第i次while体循环的次数       c5
                j--;                                //Σt(i),i=2,3…n                                  c6
            }while(j>=0 && key<array[j]);           //Σt(i),i=2,3…n                         c7                 
            array[j+1]=key;                         //n-1                                            c8
        }
    }
    for(i=0;i!=size;++i)
        cout<<array[i]<<",";
    cout<<endl;
}
int main()
{
    int array[]={5,2,4,6,1,3};
    int size=6;
    insert_sort_function(array,size);
    return 0;
}

 以上是插入排序的代码。通常一个算法的运行时间是指在特定输入时,所执行的操作数(步数)。

则以上的算法的步数为n*c1+(n-1)*c2+(n-1)*c3+(n-1)*c4+c5*Σt(i)+c6*Σt(i)+c7*Σt(i)+c8*(n-1)

最好的情况下,整个数列为正序,则只会进行if(array[i]<array[i-1])判断,然后直接执行array[j+1]=key,则总消耗为n*c1+(n-1)*c2+c8*(n-1)=(c1+c2+c8)n-(c2+c8),即an+b~O(n).

最差的情况下,这个数列为倒序,则第i次,while循环体判断的次数为(i-1)次,则总消耗为n*c1+(n-1)*c2+(n-1)*c3+(n-1)*c4+c5*Σ(i-1)+c6*Σ(i-1)+c7*Σ(i-1)+c8*(n-1)=n*c1+(n-1)*(c2+c3+c4+c8)+(n-1)n/2*(c5+c6+c7),即a*n^2+bn+c~O(n^2)

一般以最差情况下的运行时间为整个算法运行时间的上限。即使平均情况下,时间与最差也是同一个等级。

 

posted on 2013-03-26 22:30  linxihuanghuang  阅读(301)  评论(0编辑  收藏  举报