Untitled
unknown
plain_text
a year ago
3.2 kB
4
Indexable
//поиск 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