«

101~102 . 二分查找法进价1习题

点亮灯 发布于 阅读:56 C++


1、利用二分查找法从排好顺序(从小到大)的数组中查找重复存在的多个元素的最后 一个.

#include<iostream>
using namespace std;
int main() {
    int a[9]{ 1, 2, 3, 4,4, 6,8 , 37, 100 };
    int b;
    int shur; //输入
    int da,xiao;
    int zhong;
    int n = sizeof a / sizeof a[1];
    int z = -1;
    cin >> shur;
    da = n - 1, xiao = 0;
    while (da>=xiao){
        zhong = (da + xiao) / 2;
        if (a[zhong] > shur) {
            da = zhong - 1;
        }
        else if(a[zhong]<shur) {
            xiao = zhong + 1;
        }
        else {

            if (n != zhong+1 && shur == a[zhong+1]) {
                z = zhong+1;
                break;
            }
            else if(shur != a[zhong + 1]){
                z = zhong;
                break;
            }
        }
    }
    if (z == -1) {
        cout << "没有这个值.";
    }
    else {
        cout << "数组中查找重复存在的多个元素的最后 一个的位置是[" << z << ']';
    }
    cout << endl;
    system("pause");//卡屏函数
    return 0;
}

2、利用二分查找法从排好顺序(小大到小)的数组中查找重复存在的多个元素的第一个。

#include<iostream>
using namespace std;
int main() {
    int a[9]{ 1000,1000,224,56,56,43,35,20,4 };
    int b;
    int shur; //输入
    int da, xiao;
    int zhong;
    int n = sizeof a / sizeof a[1];
    int z = -1;
    cin >> shur;
    da = n - 1, xiao = 0;
    while (da >= xiao) {
        zhong = (da + xiao) / 2;
        if (a[zhong] > shur) {
            xiao = zhong+ 1;
        }
        else if (a[zhong] < shur) {
            da = zhong -1;
        }
        else {

            if (zhong!= 0  && shur == a[zhong - 1]) {
                da = zhong - 1;

            }
            else if (shur != a[zhong - 1]) {
                z = zhong;
                break;
            }
        }
    }
    if (z == -1) {
        cout << "没有这个值.";
    }
    else {
        cout << "数组中查找重复存在的多个元素的最后 一个的位置是[" << z << ']';
    }
    cout << endl;
    system("pause");//卡屏函数
    return 0;
}