Просто сохраните первый, второй, третий.
first = array[0];
second = array[1];
third = array[2];
/* scratch sort for three elements */
if(first < second)
swap(first, second);
if(first < third)
swap(first, third);
if(second < third)
swap(second, third);
/* now go through, bubbling up if we have a hit */
for(i=3;i<N;i++)
{
if(third < array[i])
{
third = array[i];
if(second < third)
{
swap(second, third);
if(first < second)
swap(first, second);
}
}
}
Я бы не стал масштабировать до k = четыре. Я думаю, что три - это ограничение для жесткого кодирования. Поскольку k получить большой, вам нужно перейти к формальному методу.
Это не отвечает на вопрос, который вы на самом деле просили, а именно, как частично сортировать, но, похоже, это то, что вы хотите.
Если вы хотите частично отсортировать, вы можете использовать quicksort и просто вернуться раньше, когда ось будет выше границы, которую вас интересует. Итак, наш первый стержень делится на пять, два. Игнорируйте последние два и на самом деле выполняйте подтипы последних пяти. Но пока это будет быстрее, чем quicksort, это не будет смена игры.Если вы можете получить консервативную верхнюю границу для k-го элемента (например, она будет составлять не более 25% между минимумом и средним значением), вы можете быстро устранить большую часть данных. Если вы ошибаетесь, это всего лишь один проход или два.
Используя метод QuickSort
int sortfirstk_r(int *array, int N, int k)
{
int pivot = 0;
int j = n -1;
int i = 1;
while(i <= j)
{
if(array[pivot] < array[i])
swap(array[i], array[j--])
else
i++;
}
sortfirstk_r(array, i, k < i ? k : i);
if(i < k)
sortfirstk_r(array +i, N -i, k - i);
}
(UNTESTED и там могут быть ошибки в немного хитрой логики сортировки).
Однако мы наивно использовали первый элемент в качестве стержня. Если мы сортируем большой набор данных, и у нас есть нормальный дистрибутив, и мы хотим получить верхнюю 1%, то z-счет равен 2.326. Возьмите немного больше, чтобы дать нам некоторую ошибку выборки, и мы сделаем первый проход с поворотным набором, скажем, 2.3 стандартными отклонениями выше среднего. Затем мы разделяем распределение на два набора: верхние 1% плюс немного, а остальные. Нам не нужно дальше обрабатывать остальные, а просто сортировать верхнюю группу.
Как бы вы нашли только самое маленькое число? Сделайте это с тремя переменными. – chrisaycock
Будет ли это более эффективным, чем 'qsort'? – RoadRunner
@RoadRunner, нахождение самого экстремального значения в массиве - это O (n), и найти самые экстремальные значения 'k' в массиве - O (kn) и при условии, что' k
deamentiaemundi