算法设计与分析——插入排序

算法思想:

将序列A[1…n]看成一个有序表A[1…i-1]和一个无序表A[i…n]。初始时,有序表中只含有第一个元素,无序表中含n-1个元素。每次都取无序表的第一个元素A[i],将其插入到有序表A[1…i-1]的恰当位置,形成新的有序表,重复n-1次即可完成排序。

算法伪代码

INSERTION-SORT(A,n)

 1.      for  j←2 to n
 2.           do  key←A[j]
 3.           i←j-1
 4.           while i>0 and A[j]>key
 5.                    do A[i+1]←A[i]
 6.                   i←i-1
 7.          A[i+1]=key

算法时间复杂度的分析

对应行的代价 次数
c1 n
c2 n-1
c3 n-1
c4 ∑t(j)
c5 ∑(t(j)-1)
c6 ∑(t(j)-1)
c7 n-1

因此,T(n)=c1+c2+c3+c4+c5+c6+c7
对于同一序列而言,n固定,而t(j)大小会影响T(n)
数组已经排好序,即对于j=2,…n,A[j]<=key成立。
则在每一次n循环中,t(j)=1。
可推算出此时的T(n)是一个关于n的线性表达式,
故时间复杂度为Θ(n)
数组按递减顺序排序,即对于j=2,…n,A[j]>key成立。
则在每一次n循环中,t(j)=j。∑t(j)是一个等差数列求和,最高次为n的平方。
可推算出此时的T(n)是一个关于n的二次表达式,故时间复杂度为Θ(n^2)

算法c++代码

1.内层循环通过for循环实现

void InsertSort(int *Array,int Size)
{
    int j,key;
    for(int i=1;i=0;j--)
         {
            if(Array[j]=j;k--)
         {
             Array[k+1]=Array[k];
         }//移动
               Array[j+1]=key;
    }
}
int main(){
 int a[] = {5,2,4,6,1,3};//c++数组中序号从0~5,而长度为6
 int len = sizeof(a)/sizeof(int);//获取数组长度
    InsertSort(a,len);
     for(int k=0;k

2.内层代码通过while循环实现

void InsertSort(int *Array,int Size)
{
 for(int i=1;i=0&&Array[j]>key)//循环的界限&插入的条件
        {                                 //虽然直观上看,一次循环后未对a[j]做改变,但是a[i+1]=a[i];
             Array[j+1]=Array[j];//在后移的过程中会改变a[j]的值,因此循环条件中不可写a[i]>a[j]
             j--;
        }
        Array[j+1]=key;
    }
}

你可能感兴趣的:(算法设计与分析)