Untitled

mail@pastecode.io avatar
unknown
plain_text
2 months ago
3.2 kB
4
Indexable
Never
 //поиск
    bool corr;
    int num_D;
    num_D = ui->search_le->text().toDouble(&corr);
    if (num_D >__INT_MAX__ or num_D < -__INT_MAX__)
    {
        QMessageBox::warning(this,"ошибка","число должно быть не больше 2 147 483 647");
        return;
    }
    if (!corr)
    {
        QMessageBox::warning(this,"ошибка","Нужно ввести число");
        return;
    }
    int key = ui->search_le->text().toInt(&corr);

    //проверка на отсортированность массива
    bool sort = true;//true - отсортирован, false - не отсортирован
    for (int i = 1; i<row;++i)
    {
        if (mas[i-1]>mas[i])
        {
            sort = false;
            break;
        }
    }
    int count = 0;//счет для кол-ва чисел в массиве
    QString IndexSearch;//номера ячеек с искомым числом
    if (!sort)//если массив не отсортирован, то используем линейный поиск
    {
        ui->typeSearch_lb->setText("Линейный поиск");
        for (int i = 0; i<row;i++)
        {
            if (mas[i] == key)
            {
                count++;
                IndexSearch.append(QString::number(i+1)+" ; ");
                ui->tableWidget-> item(i, 0) -> setBackgroundColor(Qt :: green);

            }
        }
    }
    else
    {//используем бинарный поиск если массив отсортирован

    ui->typeSearch_lb->setText("Бинарный поиск");

    QVector<int> resultIndexes;//вектор с найденными строками
    //задаем границы поиска
    int min_indx = 0;
    int max_indx = row - 1;
    while (min_indx <= max_indx)
    {
        int mid_indx = (min_indx+max_indx)/2;
        if (mas[mid_indx]<key)
        {
            min_indx = mid_indx +1;
        }
        else if (mas[mid_indx]>key)
        {
            max_indx=mid_indx-1;

        }
        else
        {
            count++;
            resultIndexes.append(mid_indx+1);
            //смотрим по сторонам
            int left_num = mid_indx - 1;
            int right_num = mid_indx + 1;
            while (left_num >= min_indx && mas[left_num]==key)
            {
                count++;
                resultIndexes.append(left_num+1);
                left_num--;
            }
            while (right_num <= max_indx && mas [right_num]==key)
            {
                count++;
                resultIndexes.append(right_num+1);
                right_num++;
            }
            break;
        }
    }
    std::sort(resultIndexes.begin(),resultIndexes.end());//сортируем вектор
    for (int num:resultIndexes)
    {
        IndexSearch.append(QString::number(num)+" ; ");
        ui->tableWidget-> item(num-1, 0) -> setBackgroundColor(Qt :: green);

    }

    }
    ui->otvet->setText(QString::number(count));
    ui->textEdit->setText(IndexSearch);

    no_auto_change = true;

    delete [] mas;
    mas = nullptr;
Leave a Comment