Сортировка кучи и Java-реализация процесса построения большой кучи

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int a[] = new int[] { 1, 1, 23, 456, 0 };
        // int a初始化方式
        int bb[] = { 1, 2, 3, 4 };
        // int c[5] = {1,2,34,5,6};//错误
        int d[] = new int[6]; // 初始为0
        // int e[] = new int[5]{1,2,34,52,2}; 错误
        int f[] = new int[] { 1, 2, 3, 4, 5, 6 };
        for (int i = 0; i != 6; ++i) {
            System.out.println("ay i=" + d + ",value=" + d[i]);
        }
        System.out.println("------------");
        // Arrays.fill(a, 0, 6, 1);
        Arrays.parallelSort(a, 0, 5);
        // 快速升序排序

        for (int i = 0; i != 5; ++i) {
            System.out.println("ay i=" + i + ",value=" + a[i]);
        }

        int[] b = Arrays.copyOfRange(a, 1, 7);
        // Array是copy,是浅copy,from需要小于长度,to超过长度将初始化为0
        for (int i = 0; i != 6; ++i) {
            System.out.println("by i=" + i + ",value=" + b[i]);
        }
        int heap_max[] = { 111, 2121, 222, 113, 11111114, 5111, 1, 3, 24, 1, 213, 123 };
        // maxHeap(heap_max, 5);
        int size = 12;

        while (size > 0) {
            maxHeap(heap_max, size);
            int last = heap_max[size - 1];
            heap_max[size - 1] = heap_max[0];
            heap_max[0] = last;
            size--;

        }

    }

    static void maxHeap(int a[], int size) {
        int last_index = size - 1;

        // 自下而上检测
        while (last_index > 0) {
            int root_index = last_index / 2;
            if (last_index % 2 == 0) {
                root_index = root_index - 1;
            } else {
            }
            int root = a[root_index];
            int left = a[root_index * 2 + 1];
            int right = 0;
            if (root_index * 2 + 2 < size) {
                right = a[root_index * 2 + 2];
            }
            if (root < left) {
                if (left < right) {
                    int rc = root;
                    a[root_index] = right;
                    a[root_index * 2 + 2] = rc;
                } else {
                    int rc = root;
                    a[root_index] = left;
                    a[root_index * 2 + 1] = rc;
                }
            } else {
                if (root < right) {
                    int rc = root;
                    a[root_index] = right;
                    a[root_index * 2 + 2] = rc;
                }
            }
            last_index -= 2;
            // System.out.println(Arrays.toString(a));
        }

        // 自上而下检测所有根节点
        int index = 0;
        while (index < size) {
            int root_index = index;
            int root = a[root_index];
            int left_index = root_index * 2 + 1;
            int left = 0;
            if (left_index < size) {
                left = a[left_index];
            } else {
                left = -1;
                break;
            }
            int right_index = root_index * 2 + 2;
            int right = 0;
            if (right_index < size) {
                right = a[right_index];
            } else {
                right = -1;
                break;
            }
            if (root < left) {
                if (left < right) {
                    int rc = root;
                    a[root_index] = a[right_index];
                    a[right_index] = rc;
                } else {
                    int rc = root;
                    a[root_index] = a[left_index];
                    a[left_index] = rc;
                }
            } else {
                if (root < right) {
                    int rc = root;
                    a[root_index] = a[right_index];
                    a[right_index] = rc;
                }
            }
            index++;
            // System.out.println(Arrays.toString(a));
        }
        System.out.println(Arrays.toString(a));
    }
}

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

Обычно массив используется для построения отношений кучи. в массиве

Индекс каждого корневого узла

корневой_индекс = левый_дочерний_индекс/2

root_index = right_child_index/2 -1;

 

left_child_index = 2*root_index+1;

правый_детский_индекс = 2*корневой_индекс+2;

 

Запомните эту взаимосвязь и затем выполните в порядке построения i-кучи:

1. Построить бинарное дерево, то есть построить его в соответствии с указанным выше соотношением позиций.

2. Обнаружение снизу вверх:

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

3. Обнаружение сверху вниз

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

 

Просто запомните эти три приказа, и все будет в порядке.

Советы:

     Конкретные предложения по кодированию: на втором этапе, если вы перемещаетесь последовательно, произойдет большое количество повторных вычислений узлов. Поскольку он начинается с листового узла, каждый узел имеет два конечных узла и будет проверяться дважды.Поэтому после каждого поиска просто подпишите индекс -2 и перейдите непосредственно к следующему корневому узлу.

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

Последнее — порядок печати.

[11111114, 2121, 5111, 113, 213, 222, 1, 3, 24, 1, 111, 123] [5111, 2121, 222, 113, 213, 123, 1, 3, 24, 1, 111,
11111114]
[2121, 213, 222, 113, 111, 123, 1, 3, 24, 1, 5111, 11111114] [222, 213, 123, 113, 111, 1, 1, 3, 24, 2121, 5111, 11111114
]
[213, 113, 123, 24, 111, 1, 1, 3, 222, 2121, 5111, 11111114] [123, 113, 3, 24, 111, 1, 1, 213, 222, 2121, 5111, 11111114
]
[113, 111, 3, 24, 1, 1, 123, 213, 222, 2121, 5111, 11111114] [111, 24, 3, 1, 1, 113, 123, 213, 222, 2121, 5111, 11111114
]
[24, 1, 3, 1, 111, 113, 123, 213, 222, 2121, 5111, 11111114] [3, 1, 1, 24, 111, 113, 123, 213, 222, 2121, 5111, 11111114
]
[1, 1, 3, 24, 111, 113, 123, 213, 222, 2121, 5111, 11111114]
[1, 1, 3, 24, 111, 113, 123, 213, 222, 2121, 5111, 11111114]

Процесс пирамидальной сортировки.

Первый шаг:
    каждый раз создайте кучу с элементами [0, N) в массиве. После завершения построения наибольшее число располагается на позиции индекса 0.

Шаг 2: Поменяйте индекс 0 последним элементом массива. После замены наибольшее число оказывается в последней позиции.

Шаг 3: N=N-1, повторяем первый шаг, N=1 просто выходим из цикла

Подведем итог:

Для ответа на вопросы лучше использовать Java, а вот C++ использовать не так удобно. Позже я перейду к 200 вопросам, чтобы взять интервью у М.С.

 

 

Guess you like

Origin blog.csdn.net/zanglengyu/article/details/132735378