Kioshilol
@Kioshilol
Student

Какой будет самый производительный алгоритм сортировки?

В общем у меня есть массив byte[N] 1<N<10^6 и из этого массива мне нужно подставить числа в формулу x = 2 * byte[i]; причем сперва в формулу должны подставляться самые большие числа, ну я подумал что для начала стоило бы отсортировать массив byte[N] по убыванию, или есть какой-то другой способ?
  • Вопрос задан
  • 225 просмотров
Пригласить эксперта
Ответы на вопрос 3
dollar
@dollar
Делай добро и бросай его в воду.
Сложность сортировки в общем случае будет O(N*log(N)).

Но если есть или вы готовы ввести дополнительные ограничения, то можно улучшить этот показатель.

Вот пример для вашего случая.
spoiler
Что есть "большое число"? Предположим, это число от 90 до 100.

Предположим, у вас значения распределены в массиве более или менее равномерно (имеется в виду частота встречаемости). На самом деле не важно, какое распределение, главное знать, какое оно. В любом случае это дополнительное условие. То есть если про массив не известно ничего, то можно либо предположить это дополнительное условие, сославшись на отсутствие прочих данных, либо поменять программу так, чтобы оно соблюдалось.

Таким образом, если распределение равномерно, то большие числа составляют примерно 10% от общего количества элементов. На самом деле важнее всего, что пороговое число - 90.

Теперь мы можем сортировать массив простым алгоритмом сложности O(N) - просто на две кучи: большие и маленькие числа. Делим массив в соотношении 1 к 10, ну и сортируем за один проход. Конечно, будут накладки, но в целом это должно быть не критично. Отсутствие важности - это тоже дополнительное условие, увы.

В результате такой стремительной сортировки вы получаете самые большие числа в начале и остальные в конце. Дальше можно скормить это вашей формуле.
Ответ написан
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Корень всех зол предварительная оптимизация (С)

byte[] bytes =  { 88, 77,67,43,74,99,89 };
	    foreach(var b in bytes.OrderByDescending(x=>x)){			
			var r = 2 * b;
		}
Ответ написан
GavriKos
@GavriKos
byte - т.е. целые, да еще и максимум 256? Проходим по массиву, считаем количество каждого числа. Т.е. заводим массив из 256 нулей, идем по вашему массиву, и инкрементим значение маленького массива, используя в качестве индекса значение из большого массива. Получим то что нужно без сортировки вообще.
Потом просто вызываем формулу нужное количество раз для каждого элемента.

Что то похожее в комментах предложил dollar, если я правильно понял.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы