算法导论2.1-2.3 部分答案

习题2.1.2

#include <iostream>

using namespace std;
void insectionSort(int a[],int len)
{
    for(int i=1;i<len;i++)
    {
        int j=i-1;
        int t=a[i];
        while(t>a[j]&&j>=0)//用t来比较而不是用a[i] 因为a[i]会变
        {
            a[j+1]=a[j];
            j--;
        }
        a[j+1]=t;
    }
}
int main()
{
    int a[7]={41,25,89,74,32,14,258};
    insectionSort(a,7);
    for(int i=0;i<7;i++)
    {
        cout<<a[i]<<" ";
    }
    return 0;
}

2.1.4 

#include <iostream>

using namespace std;
  
int* add(int a[],int b[],int n)
{
    int* c=new int(n+1);
    int t;
    for(int i=n-1;i>=0;i--)
    {
        c[i]=a[i]+b[i];//原本的new的c是有值的
    }
    for(int i=n-1;i>=1;i--)
    {
        if(c[i]==2)
        {
            c[i-1]++;
            c[i]=c[i]%2;
        }
    }
    if(c[0]==2) c[0]=0;

    return c;

}
int main()
{
   int a[3]={1,0,1};
   int b[3]={0,1,1};
   int *c=add(a,b,3);
   for(int i=0;i<3;i++)
    cout<<c[i];
   delete[] c;
    return 0;
}

2.2.2

void selectSort(int& a[],int len)
{
    for(int i=0;i<len;i++)//n=len;
    {
        int t,max=-9999999;
        for(int j=i+1;j<len;j++)//1~len的和+1
        {
            if(a[j]>max)        //1~len的和
            {
                max=a[j];       
                t=j;
            }
        }
        swap(a[i],a[t]); //len 
        
    }
    //一共用时 3*len*(len-1)/2+1~len的和+1+len+len
    // o n^2 无最好和最差之分
}

2.2.3 

线性查找

平均情况 (n+1)/2  o n

平均次数是(n+1)/2,不是n/2。
被查找的数是第1个数,则需用第1个数和被查找的数比较,要比较1次。
被查找的数是第2个数,则需用第1个数、第2个数和被查找的数比较,要比较2次。
...
被查找的数是第n个数,则需用第1个数、第2个数、...、第n个数和被查找的数比较,要比较n次。

平均次数为(1+2+...+n)/n=(n+1)/2。

最坏情况 o n

2.3-4 插入排序的递归

void insectionSort(int a[],int len)
{
    if(len==1) return;
    insectionSort(a,len-1);
        int t=a[len-1];
        int j=len-2;
        while(t>a[j]&&j>=0)
        {
            a[j+1]=a[j];
            j--;
        }
        a[j+1]=t;
    
}

T(n)=T(n-1)+o n


猜你喜欢

转载自blog.csdn.net/lirui7610/article/details/80054894