一,堆排序
1,简介:
堆排序:
1,利用堆数据结构设计的排序算法,是一种选择排序,最好、最坏平均时间复杂度都为O,也是不稳定排序,是一种完全二叉树;
2,大顶锥:每个节点的值都大于或等于其子节点的值;
3,小顶锥:每个节点的值都小于或等于其子节点的值;
排序思路:
1,将排序的序列构成一个顶锥(正序大顶锥,倒叙小顶锥);
2,此时整个序列的最值就是就是顶锥的根节点;
3,将其与末尾值进行交换就得到了末尾为最值;
4,将剩余的安装1重新构建顶锥,依次类推得到有序列的数组,达到排序效果;
2,代码
package com.sort;
import java.util.Arrays;
import java.util.jar.JarEntry;
/**
* @param
* @Author: AaNeei
* @Date: 2019/9/13 14:48
* @Description: 游学网
* @throws:
*/
public class HeapSort {
public static void main(String[] args) {
int[] arr = {4, 6, 8, 5, 9};
sort(arr);
}
public static void sort(int[] arr) {
for (int i = arr.length / 2 - 1; i >= 0; i--) {
adjustHeap(arr, i, arr.length);
}
int temp = 0;
for (int i = arr.length - 1; i > 0; i--) {
temp = arr[i];
arr[i] = arr[0];
arr[0] = temp;
adjustHeap(arr, 0, i);
}
System.out.println(Arrays.toString(arr));
}
/**
* @param arr 完全二叉树转的数组
* @param i 非叶子节点在数组中的索引
* @param length 表示每次调整的元素个数
*/
public static void adjustHeap(int[] arr, int i, int length) {
int temp = arr[i];//将当前节点保存
//k=i*2+1为当前节点的左子节点
for (int k = i * 2 + 1; k < length; k = k * 2 + 1) {
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;
}
}
堆排序是一种基于完全二叉树的排序算法,采用选择排序的方式,时间复杂度为O(n log n)。它通过构建大顶堆或小顶堆,找到序列的最值并与其末尾元素交换,逐步实现排序。本文将详细介绍堆排序的概念和实现代码。
&spm=1001.2101.3001.5002&articleId=92715467&d=1&t=3&u=21feed4a26c84cb28565531d351ca08f)
1305

被折叠的 条评论
为什么被折叠?



