堆排序(java)

简介: 堆排序(java)

 

 
public class HeapSort {
    public static void main(String[] args) {
        //要求将数组进行升序排序
        int[] arr = {4, 6, 8, 5, 9,-1};
        heapSort(arr);
        System.out.println(Arrays.toString(arr));
    }
 
    /**
     * 编写一个堆排序的方法
     *
     * @param arr
     */
    public static void heapSort(int[] arr) {
        int temp = 0;
        System.out.println("堆排序!");
        //    将无需数组构建成一个堆{9,6,8,5,4}
        for (int i = arr.length / 2 - 1; i >= 0; i--) {
            adjustHeap(arr, i, arr.length);
        }
        // 将堆顶元素与末尾元素进行交换,将最大元素下沉到数组末端
        //    重新调整结构,继续交换
        for (int j = arr.length - 1; j > 0; j--) {
            //    交换
            temp = arr[j];
            arr[j] = arr[0];
            arr[0] = temp;
            adjustHeap(arr, 0, j);
        }
    }
 
    /**
     * 将一个数组(二叉树),调整为一个大顶堆
     * 功能:完成将以i对应的非叶子节点的树调整成大顶堆
     *
     * @param arr    待调整数组
     * @param i      非叶子节点的索引
     * @param length 对多少个元素进行调整,length在逐渐减小
     */
    public static void adjustHeap(int[] arr, int i, int length) {
        //现货区当前元素的值,保存在临时变量
        int temp = arr[i];
        //    k=i*2+1 k是i的左子节点
        for (int k = i * 2 + 1; k < length; k = k * 2 + 1) {
            //    左子节点小于右子节点
            if (k + 1 < length && arr[k] < arr[k + 1]) {
                //k指向右子节点
                k++;
            }
            //    如果子节点大于父节点
            if (arr[k] > temp) {
                //将较大的值赋给当前节点
                arr[i] = arr[k];
                //i指向k继续循环比较
                i = k;
            } else {
                break;
            }
        }
        //    当for循环结束后,已经将i为父节点的树的最大值,放到了最顶部(局部)
        //    将temp值放到调整后的位置
        arr[i] = temp;
    }
}
相关文章
|
7月前
|
存储 搜索推荐 算法
堆排序详细讲解(一文足矣JAVA)
堆排序详细讲解(一文足矣JAVA)
|
4月前
|
搜索推荐 算法 Java
堆排序实战:轻松实现高效排序,附详细Java代码
嗨,大家好!我是小米,一名热爱技术分享的程序员。今天要带大家了解堆排序——一种基于二叉堆的数据结构,具有O(n log n)时间复杂度的选择排序算法。堆排序分为构建大顶堆和排序两个阶段:先建堆使根节点为最大值,再通过交换根节点与末尾节点并调整堆来逐步排序。它稳定高效,空间复杂度仅O(1),适合对稳定性要求高的场合。虽然不如快速排序快,但在避免递归和节省空间方面有优势。一起动手实现吧!如果有任何疑问,欢迎留言交流!
98 2
|
6月前
|
搜索推荐 算法 Java
Java中的快速排序、归并排序和堆排序是常见的排序算法。
【6月更文挑战第21天】Java中的快速排序、归并排序和堆排序是常见的排序算法。快速排序采用分治,以基准元素划分数组并递归排序;归并排序同样分治,先分割再合并有序子数组;堆排序通过构建堆来排序,保持堆性质并交换堆顶元素。每种算法各有优劣:快排平均高效,最坏O(n²);归并稳定O(n log n)但需额外空间;堆排序O(n log n)且原地排序,但不稳定。
50 3
|
7月前
|
算法 Java
<八大排序>万字详解(Java实现).插入排序、希尔排序、堆排序、快速排序、归并排序、计数排序...
<八大排序>万字详解(Java实现).插入排序、希尔排序、堆排序、快速排序、归并排序、计数排序
31 0
|
7月前
|
搜索推荐 算法 Java
java排序算法:快速排序、归并排序、堆排序等
排序算法:快速排序、归并排序、堆排序等
97 0
|
存储 算法 Java
数据结构——堆、堆排序和优先级队列(代码为Java版本)
数据结构——堆、堆排序和优先级队列(代码为Java版本)
|
人工智能 算法 搜索推荐
java基础算法系列(四)(堆排序的简单讲解)
java基础算法系列(四)(堆排序的简单讲解)
|
算法 搜索推荐 Java
【算法】堆排序的原理与Java实现
堆排序(Heap Sort)是一种基于堆数据结构的排序算法。堆是一种完全二叉树,其中父节点的值总是大于(或小于)其子节点的值。堆排序的基本思想是先将待排序的数组构建成一个最大堆(或最小堆),然后重复从堆顶取出最大(或最小)元素,放到已排序的部分,再调整剩余元素构建新的堆,直到所有元素都被放置到正确的位置。
120 0
|
Java 测试技术 vr&ar
大顶堆升序、小顶堆降序的堆排序(以Java描述为例版本)
大顶堆升序、小顶堆降序的堆排序(以Java描述为例版本)
170 0