首页 > 技术文章 > 堆排序

pingzilaoda 2020-08-07 09:49 原文

引用菜鸟教程的代码加入自己的理解注释 ,菜鸟教程链接https://www.runoob.com/w3cnote/heap-sort.html

public int[] sort(int[] sourceArray) throws Exception {
        // 对 arr 进行拷贝,不改变参数内容
        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

        int len = arr.length;

        buildMaxHeap(arr, len);
        
// 去掉最大数据
for (int i = len - 1; i > 0; i--) { swap(arr, 0, i); len--;
// 开始从顶部遍历 heapify(arr,
0, len); } return arr; } private void buildMaxHeap(int[] arr, int len) {
// 会遍历所有父节点,遍历后形成最大堆
for (int i = (int) Math.floor(len / 2); i >= 0; i--) { heapify(arr, i, len); } } //交换下标 private void heapify(int[] arr, int i, int len) { int left = 2 * i + 1; int right = 2 * i + 2; int largest = i; if (left < len && arr[left] > arr[largest]) { largest = left; } if (right < len && arr[right] > arr[largest]) { largest = right; } if (largest != i) { swap(arr, i, largest);
// 配合从顶部遍历 heapify(arr, largest, len); } }
// 简单的数据交换
private void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; }

 

推荐阅读