堆排序
1.定义
指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
2.基本思想
将需要排序的序列构造成一个大/小顶堆,根据大/小顶堆的性质,当前堆的根节点(堆顶)就是序列中最大/小的元素;2、将堆顶元素和最后一个元素交换,然后将剩下的节点重新构造成一个大/小顶堆;3、重复步骤2,如此反复,从第一次构建大顶堆开始,每一次构建,我们都能获得一个序列的最大值,然后把它放到大顶堆的尾部。最后,就得到一个有序的序列了。
3.代码实现
public class HeapSort {
public static void sort(int[] arr) {
HeapSort heapSort = new HeapSort();
//1.构建大顶堆
for (int i = arr.length / 2 - 1; i >= 0; i--) {
//从第一个非叶子结点从下至上,从右至左调整结构
heapSort.adjustHeap(arr, i, arr.length);
}
for (int j = arr.length - 1; j > 0; j--) {
//交换堆顶元素与末尾元素
heapSort.swap(arr, 0, j);
//调整大顶堆
heapSort.adjustHeap(arr, 0, j);
}
}
//调整大顶堆
private void adjustHeap(int[] arr, int i, int length) {
//取出当前元素
int temp = arr[i];
//判断当前元素的子元素大小
for (int k = 2 * i + 1; k < length; k = k * 2 + 1) {
//如果右子元素大于左子元素。将k指向右子元素
if (k + 1 < length && arr[k] < arr[k + 1]) {
k++;
}
//判断当前元素是否比子元素大,不大则进行交换。
if (arr[k] > temp) {
arr[i] = arr[k];
i = k;
} else {
break;
}
}
arr[i] = temp;
}
//交换元素
private void swap(int[] arr, int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
}