排序和二分查找题

题目:
输入一段不定长度的数字(各不相同),要求输入一个查找数字,如果在第一次输入中存在则输出其在数组中的位置,如果不存在则输出按从小到大排序存储在数组的位置;
结果要求:
输入:
4 {1 3 5 4} 2
6 {7 3 4 9 10 5} 9
输出:
1
4

我的程序:

#include <iostream>
using namespace std;

int main(int argc, char const *argv[])
{
    int k;
    cin>>k;
    int array[k];
    cin>>array[0];
    for (int i = 1; i < k; ++i)
    {
        cin>>array[i];
        if(array[i]<array[i-1])
        {
            int temp =array[i];
            array[i] =array[i-1];
            array[i-1] =temp;
            continue;
        }
        if(array[i]==array[i-1])
        {
            cout<<"Same!"<<endl;
        }
    }
    int target;
    cout<<"What is your number?"<<endl;
    cin>>target;
    int left =0,right =k-1;
    while(left<=right)                          
    {
        int mid =(left+right)/2;
        if(array[mid] == target) {cout<<mid<<endl;break;}
        if(array[left] == target) {cout<<left<<endl;break;} 
        if(array[right] == target) {cout<<right+1<<endl;break;}
        if(array[mid] > target) {right =mid-1;continue;}
        if(array[mid] < target) {left =mid+1;continue;}
        if(target >array[mid] && target <array[mid+1]) {cout<<mid+1<<endl;break;}   
    }
    return 0;
}

结果:
这里写图片描述
错误教训:

这里写图片描述
left ==right 还会进行迭代

修正好的程序:

#include <iostream>
using namespace std;

int main(int argc, char const *argv[])
{
    int k;
    cin>>k;
    int array[k];
    cin>>array[0];
    for (int i = 1; i < k; ++i)
    {
        cin>>array[i];
        if(array[i]<array[i-1])
        {
            int temp =array[i];
            array[i] =array[i-1];
            array[i-1] =temp;
            continue;
        }
        if(array[i]==array[i-1])
        {
            cout<<"Same!"<<endl;
        }
    }
    int target;
    cout<<"What is your number?"<<endl;
    cin>>target;
    int left =0,right =k-1;
    while(left<=right)                          
    {
        int mid =(left+right)/2;
        if(array[mid] == target) {cout<<mid<<endl;break;}
        if(array[left] == target) {cout<<left<<endl;break;}
        if(target >array[mid] && target <array[mid+1]) {cout<<mid+1<<endl;break;}       
        if(array[right] == target) {cout<<right+1<<endl;break;}
        if(array[mid] > target) {right =mid-1;continue;}
        if(array[mid] < target) {left =mid+1;continue;}

    }
    return 0;
}

结果:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值