Как мне отбросить самое низкое значение?

Я довольно новичок в C ++, и мне нужна помощь в поиске кода для отбрасывания наименьшего значения из случайно сгенерированного набора чисел. Вот мой код до сих пор:

   //Create array and populate the array with scores between 55 and 10
//  Drop lowest Score

#include <iostream>
#include <cstdlib>//for generating a random number
#include <ctime>
#include <iomanip>
#include <algorithm>
#include <vector>

using namespace std;//function prototype
int *random (int);int main()
{   int *numbers; //point to numbers
//get an array of 20 values
numbers = random(20);
//display numbers
for (int count = 0; count < 20; count++)
cout << numbers[count] << endl;
cout << endl;system("pause");
return 0;
}

//random function, generates random numbers between 55 and 100 ??

int *random(int num)
{   int *arr; //array to hold numbers
//return null if zero or negative
if (num <= 0)
return NULL;
//allocate array
arr = new int[num];
//seed random number generator
srand(time (0));
//populate array
for (int count = 0; count < num; count++)
arr[count] = (rand()%(45) +55);
//return pointer

//
return arr;
}

Для этого фрагмента кода, как мне отсортировать или найти наименьшую оценку, чтобы отбросить ее после того, как функция вернет случайные числа?

  int main()
{   int *numbers; //point to numbers
//get an array of 20 values
numbers = random(20);
//display numbers
for (int count = 0; count < 20; count++)
cout << numbers[count] << endl;
cout << endl;system("pause");
return 0;
}

Ваши предложения приветствуются!

2

Решение

В общем, чтобы найти самое низкое значение в массиве, вы можете следовать этому псевдо-алгоритму:

min = array[0] // first element in array
for (all_values_in_array)
{
if (current_element < min)
min = current_element
}

Однако вы не можете «удалить» значение из статического массива. Вы можете использовать динамический контейнер (например, вектор) или поменять местами самое низкое значение с последним, и притвориться, что размер массива на 1 меньше. Другой вариант низкого уровня — создание собственного динамического массива в куче, однако, это, вероятно, сложнее, чем вы ищете.

Использование вектора было бы намного проще. Чтобы отбросить самый низкий элемент, вам просто нужно сортировать в обратном порядке, затем удалить последний элемент. Лично я бы рекомендовал использовать вектор.

3

Другие решения

Очевидный подход к поиску наименьшего элемента заключается в использовании std::min_element(), Вы, вероятно, хотите использовать std::vector<T> держать ваши элементы, но это не является абсолютно необходимым. Вы можете удалить наименьшее значение из массива следующим образом:

if (count) {
int* it = std::min_element(array, array + count);
std::copy(it + 1, array + count--, it);
}

Предполагая, что вы разумно использовали std::vector<int> вместо этого код будет выглядеть примерно так:

if (!array.empty()) {
array.erase(std::min_element(array.begin(), array.end()));
}
2

Сначала найдите индекс наименьшего числа:

int lowest_index=0, i;
for (i=0; i<20; i++)
if (arr[i]<arr[lowest_index])
lowest_index=i;

Теперь, когда мы знаем индекс, переместите числа, следующие за этим индексом, чтобы перезаписать индекс, который мы нашли. Число номеров для перемещения будет 19 минус найденный индекс. То есть, если индекс 2 (третье число, так как первое находится в индексе 0) является самым низким, то после этого индекса идет 17 чисел, так что нам нужно переместиться.

memcpy(&arr[lowest_index],&arr[lowest_index+1],sizeof(int)*(19-lowest_index))

Удачи!

0

Сортировать массив по возрастанию.
Наименьшее значение будет в начале массива.

Или отсортируйте массив по убыванию и удалите последний элемент.

0

В дополнение к тому, что говорили другие, вы также можете использовать что-то вроде, например, std :: list. Он имеет встроенную сортировку, также предлагая возможность определить собственную функцию сравнения для двух элементов. (Хотя для ints это не обязательно)

Во-первых, я обычно печатаю определение вектора или списка с типом элементов, которые он будет содержать. Далее, для списков я печатаю определение итератора — хотя оба они являются просто удобством, ни то, ни другое не нужно.

Как только у вас есть список, который будет содержать целые, просто добавьте их в него. Привычка и нет необходимости делать иначе означает, что я буду использовать .push_back для добавления каждого нового элемента. После этого я отсортирую список, возьму элемент с наименьшим значением (также с наименьшим «индексом» — первый элемент), а затем, наконец, удалю этот элемент.

Некоторый код для размышления:

#include <cstdio>
#include <cstdlib>
#include <list>using namespace std;

typedef list<int> listInt;
typedef listInt::iterator listIntIter;

bool sortAsc(int first, int second)
{
return first < second;
}

bool sortDesc(int first, int second)
{
return first > second;
}

int main (void)
{
listInt mList;
listIntIter mIter;
int i, curVal, lowestScore;

for (i=1; i<=20; i++)
{
curVal = rand()%45 + 55;
mList.push_back(curVal);
printf("%2d. %d\n", i, curVal);
}
printf("\n");

mList.sort();
//    mList.sort(sortAsc);  // in this example, this has the same effect as the above line.
//    mList.sort(sortDesc);

i = 0;
for (mIter=mList.begin(); mIter!=mList.end(); mIter++)
printf("%2d. %d\n", ++i, *mIter);
printf("\n");

lowestScore = mList.front();
mList.pop_front();
printf("Lowest score: %d\n", lowestScore);

return 0;
}

Да, и выбор использования printf, а не cout тоже был осознанным. По нескольким причинам.

  1. Личные предпочтения — мне легче набирать printf("%d\n", someVar);
    чем cout << someVar << endl;
  2. Размер — встроенный с помощью gcc под Windows, exe-версия релиза в этом примере составляет 21 КБ.
    Используя cout, он прыгает до 459kb — для той же функциональности! Увеличение в 20 раз без выгоды? Нет, спасибо!!

Вот ссылка std :: list: http://www.cplusplus.com/reference/stl/list/

0

На мой взгляд, наиболее оптимальным решением вашей проблемы было бы использовать связанный список для хранения чисел, таким образом, вы можете использовать алгоритм со сложностью O (N) = N чтобы найти наименьший элемент в списке, это аналогичный метод поиска, заданный user1599559 или Mikael Lindqvist, вам нужно только сохранить вместе с минимальным значением указатель на Item (ItemX) в связанном списке, который хранит его, затем устранить Элемент X просто скажи Элемент X — 1 указывает на Элемент X + 1 и свободная память, выделенная элементом X

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector