Мне нужен алгоритм для выбора самого большого или наименьшего значения для k. Значения будут ints. Мой инструктор сказал мне использовать модифицированный алгоритм разбиения, чтобы найти наибольшее или наименьшее значение для k. Есть предположения?Проблема программирования сортировки раздела
ответ
Ниже приведено описание алгоритма quickselect. Я предполагаю, что вы хотите найти самое маленькое значение.
Возьмите первый элемент вашего массива. Это будет вашим стержнем. Следите за своим положением.
Разделите массив на основе этого стержня. Элементы, меньшие, чем ваш стержень, идут до вашего стержня в массиве; больше, после вашего стержня. (Этот шаг перемещает ваш стержень. Следите за его положением в вашем массиве.)
Теперь вы знаете, что ваш стержень больше
pivot_position
Количество элементов. Поэтому ваш стержень - это самый маленький элемент (pivot_position + 1
).Если к равно
pivot_position + 1
, то вы нашли свой к ое наименьшее значение. Поздравляем, возвращаемpivot_position
в качестве позиции этого значения в массиве.Если k составляет менее
pivot_position + 1
, вы хотите, чтобы какое-то значение было меньше вашего стержня. Посмотрите в части массива перед вашей точкой поворота для наименьшего значения для k.Если k больше
pivot_position + 1
, вы хотите, чтобы какое-то значение было больше вашего стержня. Посмотрите в части массива после вашего поворота для наименьшего значения * k - (pivot_position
+ 1) * th (поскольку эта часть массива исключает наименьшие значения (pivot_position
+ 1)).
Поскольку вы используете C++, вероятно, вы должны реализовать свои функции следующим образом:
int select(int *array, int left, int right, int k);
int partition(int *array, int left, int right, int pivot_position);
select
принимает ваш массив, левую и правую границы, и ваш K. Для уточнения, array[left]
будет первым элементом; array[right]
будет последним; right - left + 1
будет длиной массива. select
возвращает позицию k th наименьший элемент.
partition
принимает ваш массив, левую и правую границы и начальную позицию вашего стержня. Безопасно просто передавать 0 для pivot_position
каждый раз, что означает, что вы хотите использовать первый элемент в массиве в качестве точки опоры. (В вариации, называемой randomized quickselect, вы выбираете случайный pivot_position
.) partition
возвращает положение точки опоры после того, как вы закончите движение вокруг.
STL имеет функцию partial_sort
, которая сортирует первые k элементов последовательности и позволяет вам захватить этот элемент простым поиском.
Другими словами, найдите std::partial_sort
, а остальное будет очевидно.
В STL есть также функция nth_element
. Я уверен, что вы можете понять, как его использовать.
- 1. Проблема раздела
- 2. Порядок сортировки EBean из раздела
- 3. Проблема с содержанием раздела
- 4. Поиск временной сложности раздела методом быстрой сортировки
- 5. NSFetchedResultsController различные дескрипторы сортировки для каждого раздела
- 6. Проблема программирования MIPS
- 7. Быстрая проблема синтаксиса программирования
- 8. Проблема программирования. Lag
- 9. R проблема программирования
- 10. Проблема программирования AVR SPI
- 11. Проблема сетевого программирования
- 12. Проблема программирования в Stata
- 13. Проблема программирования на Java
- 14. Проблема функционального программирования - JS
- 15. C++ проблема программирования
- 16. Java сокет проблема программирования
- 17. сборка проблема языка программирования
- 18. Основная проблема программирования C
- 19. проблема программирования перенаправления UNIX
- 20. C проблема программирования
- 21. мне нужна помощь программирования Radix сортировки
- 22. быстрой сортировки массив программирования символов (строка) C
- 23. Проблема сортировки массива: 2 различных результата сортировки
- 24. MySQL запись сортировки проблема
- 25. Проблема сортировки JSON объект
- 26. Проблема сортировки данных
- 27. Проблема сортировки DataGrid
- 28. Проблема сортировки TVirtualTreeview
- 29. Интересная проблема сортировки
- 30. Проблема сортировки списка указателей
Google для «алгоритма сортировки раздела» – 2009-05-21 07:22:18