数据结构习题课2(线性表)

1线性表(a1,a2,a3,a4.....,an)中的元素递增有序且顺序存储于计算机内。要求设计一个算法完成,用最少时间在表中查找数值为X的元素,若找到则将与其与后继元素位置相交换,若找不到,则将其插入表中,并使表中元素仍递增有序。

void SearchExchangeInsert( ElemType[],ElemType x){
    int low=0;
    int high=n-1;
    int mid;
    while(low<=high){//照应题目中递增 有序 顺序 存储 采用折半查找
        mid=(low+high)/2;
        if(A[mid]==x){
            break;
        }
        else{
            if(A[mid]<x){
                low=mid+1;
            }
            else{
                high=mid-1;
            }
        }
    }
    if(A[mid]==x&&mid!=n-1){//若最后一个元素与x相等,则不存在与其后继交换的操作
        int t=A[mid];
        A[mid]=A[mid+1];
        A[mid+1]=t;
    }
    if(low>high){       //查找失败,插入数据元素x
        for(i=n-1;i>high;i--){
            A[i+1]=A[i];
            A[i+1]=x;
        }
    }


}

2设将 n个整数存放到一维数组中,设计一个在时间和空间两方面都尽可能高效的算法。将R中保存的序列循环左移P(0<P<n)个位置即将R中保存的数据由(X0,X1,......Xn-1)变换为(Xp,Xp+1.......Xn-1,X0,X1.....Xp-1)。给出算法的基本设计思想,根据思想写出算法。说明所设计算法的时间复杂度和空间复杂度。

设计思想:进行了3次逆置,第一次是在0到p-1(下标)之间 举例子

1 2 3 4 5(n=4,p=5)最终结果应为(5 1 2 3 4)第一次翻转是在(1 2 3 4)翻转成为4 3 2 1

第二次翻转对5进行翻转,经过两次翻转数组变为( 4 3 2 1 5),第3次翻转对整个数组进行翻转

(5 1 2 3 4)

void Reverse(int R[],int from,int to){
    int i,temp;
    for(i=0;)
    for(i=0;i<(to-from+1)/2;i++){
        {
            temp=R[from+i];
            R[from+i]=R[to-i];
            R[to-i]=temp;
        }
    }
}
void  Converse(int R[],int n,int p){
       Reverse(R,0,p-1);
       Reverse(R,p,n-1);
       Reverse(R,0,n-1);
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值