算法——堆排序(大根堆--升序)
Posted 高、远
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法——堆排序(大根堆--升序)相关的知识,希望对你有一定的参考价值。
【1】堆排序基本介绍
- 升序采用大顶堆、降序采用小顶堆
【2】堆排序重难点
①如何由一个无序序列建成一个堆?
②如何在输出堆顶元素后,调整剩余元素成为一个新的堆
【3】代码:
package algorithm.sort.heapSort;
import java.util.Arrays;
/**
* 大根堆,升序排序
*/
public class HeapSort {
public static void main(String[] args) {
int[] arr = {3, 7, 15, 10, 4, 2};
heapSort(arr);
System.out.println(Arrays.toString(arr));
}
/**
* @param arr
*/
public static void heapSort(int[] arr) {
//用来暂时保存堆顶元素
//方便将堆顶元素放在数组最后
int temp;
//构建一个大根堆
for (int i = arr.length / 2 - 1; i >= 0; i--) {
heapAdjust(arr, i, arr.length);
}
//创建好大根堆后,将堆顶元素,放在最后一个位置,并将调整为一个新的堆
//如果数组有6个元素。那么我们只需要循环5次就好,找到5个大的元素。剩下的一个自然就排好了
for (int i = arr.length - 1; i > 0; i--) {
//将堆顶元素放在数组最后一个
temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
//穿的节点肯定是第一个,因为只有第一个节点进行了交换,所以以这个节点为根节点
//调整为一个新的大根堆
//i会减小,以为数组后面的数已经排好序了
heapAdjust(arr, 0, i);
}
}
/**
* @param arr
* @param i
* @param length
*/
public static void heapAdjust(int[] arr, int i, int length) {
//暂存
int temp = arr[i];
//从i结点的左子结点开始,也就是2i+1处开始
for (int j = 2 * i + 1; j < length; j = 2 * j + 1) {
//如果存在右子节点,并且左子结点小于右子结点,让j=j+1指向右子结点
if (j + 1 < length && arr[j] < arr[j + 1])
j += 1;
//如果子节点大于父节点,将子节点值赋给父节点(不用进行交换),
// 因为temp的值还要进行比较才知道放在哪个位置
if (temp < arr[j]) {
arr[i] = arr[j];
i = j;
} else {
break;
}
}
//将temp值放到最终的位置
arr[i] = temp;
}
}
【4】测试结果:
-
需要排序的数组:
-
程序运行结果:
参考:https://www.cnblogs.com/chengxiao/p/6129630.html
以上是关于算法——堆排序(大根堆--升序)的主要内容,如果未能解决你的问题,请参考以下文章