Сортировка кучи относится к алгоритму сортировки, разработанному с использованием структуры данных кучи. Упаковка - это структура, которая является приблизительно полностью двоичным деревом и удовлетворяет свойствам укладки: то есть значение ключа или индекс дочернего узла всегда меньше (или больше) его родительского узла.
Средняя временная сложность кучи сортирует (nlogn).
Алгоритм шаги:
1. Создайте кучу H [0..n-1]
2. Поменяйте головку кучи (максимум) и хвост кучи
3. Уменьшите размер кучи на 1 и вызовите shift_down (0). Цель состоит в том, чтобы настроить верхние данные нового массива в соответствующую позицию.
4. Повторите шаг 2, пока размер кучи не станет 1
куча:
Куча на самом деле является полностью двоичным деревом, и любой нелистный узел его нелизового узла удовлетворяет его свойствам: ключ [i] <= ключ [2i+1] && key [i] <= ключ [2i+2] или ключ [i]> = ключ [2i+1] && key> = key [2i+2], это является лишним словом, и это, как это, не является ключевым словом, не менее или менее, что не так, что не так, что не так, что не так, что не так, что не так, что не так, что не так, что не так, как и это, и не является ключевым словом. Куча разделена на большую верхнюю кучу и небольшую верхнюю кучу. Удовлетворительный ключ [i]> = ключ [2i+1] && key> = key [2i+2] называется большой верхней кучей. Удовлетворительный ключ [i] <= ключ [2i+1] && key [i] <= ключ [2i+2] называется маленькой верхней кучей. Из приведенных выше свойств мы видим, что ключевые слова в верхней части большой верхней кучи, безусловно, являются самыми крупными из ключевых слов, а ключевые слова в верхней части маленькой верхней кучи - это наименьшее из всех ключевых слов.
Идея сортировки кучи:
Функция самого большого ключевого слова (минимальное ключевое слово), которое записывается в верхней части большой верхней кучи (небольшая верхняя куча), позволяет легко выбрать самую большую запись (минимальную запись) из расстройства каждый раз. Основная идея (большая верхняя куча): 1) Построить начальную последовательность ключевых слов, которые будут сортироваться (R1, R2… .Rn) в большую верхнюю кучу, которая является начальной неупорядоченной областью; 2) обменять верхний элемент кучи r [1] с последним элементом r [n], а затем получить новую неупорядоченную область (r1, r2,… rn-1) и новую упорядоченную область (RN) и удовлетворить r [1,2… n-1] <= r [n]; 3) Поскольку новый верхний Heap Top R [1] после обмена может нарушить свойства кучи, необходимо регулировать текущую неупорядоченную область (R1, R2,… RN-1) на новую кучу, а затем обмениваться R [1] с последним элементом беспорядочной площади снова, чтобы получить новую расстройство (R1, R2… .Rn-2) и новая порядок (RN-1). Повторите этот процесс, пока количество элементов в упорядоченной области не станет N-1, а весь процесс сортировки не будет завершен. Процесс работы заключается в следующем: 1) инициализировать кучу: конструкция r [1..n] как куча; 2) Обменивайтесь верхним элементом Heap R [1] текущей неупорядоченной области с последней записью в интервале, а затем отрегулируйте новую неупорядоченную область в новую кучу. Следовательно, для сортировки кучи две наиболее важные операции - построить начальную кучу и отрегулировать кучу. Фактически, построение начальной кучи на самом деле является процессом регулировки кучи, но построение начальной кучи-это регулировать все нелистые узлы.
Пример иллюстрации
Учитывая массив формирования a [] = {16,7,3,20,17,8}, куча сортирует его. Во -первых, построить полное двоичное дерево на основе элемента массива и получить
Затем вам нужно построить начальную кучу, а затем начать регулировку из последнего нелистного узла. Процесс корректировки заключается в следующем:
После обмена 20 и 16, 16 вызывает 16, чтобы не соответствовать свойствам кучи, поэтому ее необходимо перенаправить.
Это дает начальную кучу.
Когда он отрегулируется первым, он становится большой верхней кучей.
То есть каждая корректировка состоит в том, чтобы выбрать самый большой из родительского узла, левого дочернего узла и правильного дочернего узла для обмена с родительским узлом (после обмена обменом детского узела, который обменивается детский узел, может привести к обмену детского узела, чтобы не соответствовать характеру кучи, поэтому обмен детский узел должен быть снова корректирован после каждого обмена). С начальной кучей вы можете ее отсортировать.
В настоящее время 3 расположено в верхней части кучи, а свойства не полны кучи. Вам нужно настроить и продолжать настраивать.
Таким образом, весь интервал уже упорядочен. Из приведенного выше процесса мы видим, что сортировка кучи на самом деле является своего рода сортировкой выбора, сортировки выбора деревьев. Но чтобы непосредственно выбрать заказ, чтобы выбрать максимальную запись из R [1 ... n], необходимо сравнивать n-1 раза, а затем выбрать максимальную запись из R [1 ... n-2], необходимо сравнить n-2 раза. Фактически, многие из этих сравнений N-2 были проведены в предыдущих сравнениях N-1, и сортировка выбора деревьев просто использует характеристики дерева, чтобы сохранить некоторые из предыдущих результатов сравнения, поэтому количество сравнений может быть уменьшено. Для N -ключевых последовательностей, в худшем случае, каждый узел должен сравнивать время log2 (n), поэтому его худшая сложность времени - NLOGN. Сорт куча нестабильна и не подходит для сортировки с меньшим количеством записей. Так много было описано выше. Короче говоря, основная практика сортировки кучи: сначала используйте исходные данные, чтобы построить большую (небольшую) кучу в качестве исходной неупорядоченной области, а затем каждый раз, когда верхний элемент кучи вывозится и помещается в упорядоченную область. Поскольку верхний элемент кучи вынужден, мы поместили последний элемент в кучу в верхнюю часть кучи, поэтому свойства кучи разрушаются. Нам нужно повторно настроить кучу и продолжить время, а затем n элементов в неупорядоченной области помещаются в упорядоченную область, а процесс сортировки завершается.
(Строительный стек снизу вверх)
Практическое применение:
На практике мы выполняем сортировку кучи, чтобы получить максимальное или минимальное значение при определенных условиях. Например: 10 максимальных значений должны быть найдены среди 100 чисел. Поэтому мы определяем кучу размера 10, создаем первые десять данных в 100 в небольшую верхнюю кучу (верхняя часть кучи), а затем сравниваем их с верхней частью кучи из 11 -го данных в 100 данных. Если верхняя часть кучи меньше текущих данных, топость кучи выскочивается, нажмите текущие данные в верхнюю часть кучи, а затем перенесите данные из верхней части кучи в определенную позицию.
Код:
Общедоступный Test0 (int m) {arr = rr; // rup array, arr; arr; arr; arr; // arr; // static int m = 0; static int = 0; // Используется для обозначения допустимых данных в общедоступной void addToSmall (int v) {// int [] a = a = a = a = a = a = a = a = a = a = a = a = a = a = a = {16,4,5,9,1,10,11,12,13,14,15,2,3,6,7,8,111,222,333,555,66,67,54}; // размер кучи составляет 10 // arr int [10]; if (size <arr.length) {arr [size] = v; add_sort (size); // add_sort1 (size); size ++;} else {arr [0] = v; add_sort1 (0);}} public printsmall () {for (int_sort1 (0);}} public void printsmall () {int i = 0; i <size; i ++) {System.out.println (arr [i]);}} public void del () {size-; arr [0] = arr [9]; add_sort1 (0);} public void small (int index) {if (m <arr.length) {add_sort (index); m ++;} else {add_sort1 (index); m ++;}} public void add_sort (int index) {// Маленькая верхняя куча, сборка/ * * * Массив нечетный, это левый ребенок*Если последний в массиве ровно, это правильный ребенок, если дочерний узел больше, чем родительский узел, выполняется обмен значения. Если правый ребенок больше левого ребенка, выполняется обмен значениями * */int par; if (index! = 0) {if (index%2 == 0) {par = (index-1)/2; if (arr [index] <arr [par]) {swap (arr, index, par); add_sort (par);} if (arr*arr [par*2]) {swap (arr, par*2); dex] <arr [par]) {swap (arr, index, par);} add_sort (par);}} else {par = index/2; if (arr [index] <arr [par]) {swap (arr, index, par); add_sort (par);} if (arr*arr*2+1) par*2+1); if (arr [index] <arr [par]) {swap (arr, index, par);} add_sort (par);}}}} public void add_sort1 (int index) {// Регулирование маленькой верхней кучи/*Регулируя сверху вниз*, если у детей более длинный. справа = индекс*2+1; инт max = 0; if (слева <10 && arr [arr] <arr [index]) {max = слева;} else {max = index;} if (right <10 && arr [right] <arr [max]) {max = справа;} if (max! Импорт java.util.scanner; открытый класс main_test0 {public static void main (string args []) {scanner scan = новый сканер (System.in); System.out.println ("(Small Top Heap) Пожалуйста, введите размер кучи:"); int m = scan.nextint (); test0 test = new Test0 (m); {16,4,5,9,1,10,11,12,13,14,15,2,3,6,7,8}; для (int i = 0; i <a.length; i ++) {test.addtosmall (a [i]);} test.printsmall (); test.del ();Приведенный выше пример сортировки кучи Java (большая верхняя куча, небольшая верхняя куча) - это все контент, которым я делюсь с вами. Я надеюсь, что вы можете дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.