【王道数据结构编程题】- 查找数值为x的元素 + 循环左移p个位置

目录

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

2.王道代码题:【2010统考真题】设将n(n>1)个整数存放到一维数组R中。设计一个在时间和空间两方面都尽可能高效的算法。将R中保存的序列循环左移p(0


其他-王道数据结构算法题-顺序表题,如下

顺序表-删除最小值元素+元素逆置

顺序表-删除所有值为x的数据元素+删除值在给定值s与t之间所有元素

顺序表-删除值在给定值之间元素+删除值重复元素

顺序表-两个有序顺序表合并+两个顺序表位置互换

顺序表-找出两个序列A和B的中位数+找出序列A的主元素

顺序表-找出未出现的最小正整数+三元组最小距离

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

代码实现:

//折半查找
#include<iostream>
using namespace std;
int a[10]={1,2,3,4,5,6,7,8,9};
int n=9;
void findd(int a[],int x)
{
    int left,right,mid;
    left=0,right=n-1;
    while(left<=right)
    {
       mid=(left+right)/2;
       if(a[mid]==x) break;
       else if(a[mid]>x) right=mid-1;
       else left=mid+1;
    }
    if(a[mid]==x&&mid!=n-1)
    {
        int t=a[mid];
        a[mid]=a[mid+1];
        a[mid+1]=t;
    }
    if(right<left){
        int i;
        for(i=n-1;i>right;i--)
        {
            a[i+1]=a[i];
        }
        a[i+1]=x;
    }
}
int main()
{
	int i;
    for(i=0;i<9;i++) cout<<a[i]<<" ";
    cout<<endl;
    findd(a,7);

    for(i=0;i<9;i++) cout<<a[i]<<" ";
    cout<<endl;
    return 0;
}

找到,其与后继元素位置互换

int a[10]={1,2,3,4,5,7,8,9,10};
int main()
{
	int i;
    for(i=0;i<9;i++) cout<<a[i]<<" ";
    cout<<endl;
    findd(a,6);

    for(i=0;i<10;i++) cout<<a[i]<<" ";
    cout<<endl;
    return 0;
}

没找到,则将其值插入表中 ,表仍然递增有序。

2.王道代码题:【2010统考真题】设将n(n>1)个整数存放到一维数组R中。设计一个在时间和空间两方面都尽可能高效的算法。将R中保存的序列循环左移p(0<p<n)个位置,即将R中的数据由(X0,X1,...,Xn-1)变换为(Xp,Xp+1,...,Xn-1,X0,X1,...,Xp-1)。

代码实现:

//循环左移
#include<iostream>
using namespace std;

int a[7]={1,2,3,4,5,6,7};
int n=7;
void reverse(int a[],int l,int r)
{
    for(int i=l;i<=(l+r)/2;i++)
    {
        int t=a[i];
        a[i]=a[(l+r)-i];
        a[(l+r)-i]=t;
    }
}
void prin(int a[])
{
    for(int i=0;i<n;i++) cout<<a[i]<<" ";
    cout<<endl; 
}
void change(int a[],int left)
{
    cout<<"全部逆置"<<endl;
    reverse(a,0,n-1);
    prin(a);
    cout<<"前n-left个逆置"<<endl;
    reverse(a,0,n-left-1);
    prin(a);
    cout<<"后left个逆置"<<endl;
    reverse(a,n-left,n-1);
    prin(a);
}
int main()
{
    cout<<"一开始数组"<<endl;
    prin(a);
    change(a,3);
    return 0;
}

循环左移3

循环左移6

int main()
{
    cout<<"一开始数组"<<endl;
    prin(a);
    change(a,6);
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chenruhan_QAQ_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值