package com.taobao.thrift.server;
public class HeapStack {
private static int[] sort = new int[]{1,0,10,20,3,5,6,4,9,8,12,17,34,11};
public static void main(String[] args) {
System.out.println(String.valueOf(3<<1));
buildMaxHeapify(sort);
heapSort(sort);
print(sort);
}
private static void buildMaxHeapify(int[] data){
//没有子节点的才需要创建最大堆,从最后一个的父节点开始
int startIndex = getParentIndex(data.length - 1);
//从尾端开始创建最大堆,每次都是正确的堆
for (int i = startIndex; i >= 0; i--) {
maxHeapify(data, data.length, i);
}
}
/**
* 创建最大堆
* @param data
* @param heapSize 需要创建最大堆的大小,一般在sort的时候用到,因为最多值放在末尾,末尾就不再归入最大堆了
* @param index 当前需要创建最大堆的位置
*/
private static void maxHeapify(int[] data, int heapSize, int index){
// 当前点与左右子节点比较
int left = getChildLeftIndex(index);
int right = getChildRightIndex(index);
int largest = index;
if (left < heapSize && data[index] < data[left]) {
largest = left;
}
if (right < heapSize && data[largest] < data[right]) {
largest = right;
}
//得到最大值后可能需要交换,如果交换了,其子节点可能就不是最大堆了,需要重新调整
if (largest != index) {
int temp = data[index];
data[index] = data[largest];
data[largest] = temp;
maxHeapify(data, heapSize, largest);
}
}
/**
* 排序,最大值放在末尾,data虽然是最大堆,在排序后就成了递增的
* @param data
*/
private static void heapSort(int[] data){
//末尾与头交换,交换后调整最大堆
for (int i = data.length - 1; i > 0; i--) {
int temp = data[0];
data[0] = data[i];
data[i] = temp;
maxHeapify(data, i, 0);
}
}
/**
* 父节点位置
* @param current
* @return
*/
private static int getParentIndex(int current){
return (current - 1) >> 1;
}
/**
* 左子节点position 注意括号,加法优先级更高
* @param current
* @return
*/
private static int getChildLeftIndex(int current){
return (current << 1) + 1;
}
/**
* 右子节点position
* @param current
* @return
*/
private static int getChildRightIndex(int current){
return (current << 1) + 2;
}
private static void print(int[] data){
int pre = -2;
for (int i = 0; i < data.length; i++) {
if (pre < (int)getLog(i+1)) {
pre = (int)getLog(i+1);
System.out.println();
}
System.out.print(data[i] + " |");
}
}
/**
* 以2为底的对数
* @param param
* @return
*/
private static double getLog(double param){
return Math.log(param)/Math.log(2);
}
}
相关推荐
以下是一个简单的Java代码示例,演示如何手动实现堆排序: ```java public class HeapSort { public void sort(int[] arr) { int n = arr.length; // 建堆 for (int i = n / 2 - 1; i >= 0; i--) heapify(arr...
以下将详细介绍堆排序的原理、步骤以及Java实现。 **堆排序的原理** 堆排序的核心思想是构建一个完全二叉树,即堆,然后通过调整堆结构,使得根节点(最大元素或最小元素)总能处于正确的位置。这个过程分为两个...
附件是堆排序Java代码示例,文件绿色安全,请大家放心下载,仅供交流学习使用,无任何商业目的! 堆排序是一种高效的比较类排序算法,它利用了二叉堆的数据结构来实现排序。堆排序可以分为两个主要步骤:建堆(将...
附件是堆排序Java代码示例,文件绿色安全,请大家放心下载,仅供交流学习使用,无任何商业目的! 堆排序是一种高效的比较类排序算法,它利用了二叉堆的数据结构来实现排序。堆排序可以分为两个主要步骤:建堆(将...
在这个主题中,我们将深入探讨堆排序的概念、工作原理以及如何用Java实现它。首先,我们需要理解堆是什么。 堆是一个近似完全二叉树的结构,并同时满足堆的性质:即父节点的键值或索引总是大于或小于(在最大堆和...
通过这个文件,你可以学习到如何将理论上的堆排序算法转化为实际的Java代码,并理解每一步是如何工作的。 总的来说,堆排序算法具有O(n log n)的时间复杂度,对于大数据集来说是相当高效的。同时,由于其原地排序的...
在Java中,实现堆排序的代码如下: ```java public class HeapSort { private static int[] sort = {1, 0, 10, 20, 3, 5, 6, 4, 9, 8, 12, 17, 34, 11}; public static void main(String[] args) { heapSort...
### Java实现堆排序算法 #### 实现原理 堆排序是一种基于比较的排序算法,它主要依靠堆这种数据结构来进行操作。堆是一种特殊的完全二叉树结构,其中每个节点的值都大于等于(对于大顶堆)或小于等于(对于小顶堆...
本主题主要关注的是使用Java语言实现的一些常见的排序算法,包括冒泡排序、归并排序、快速排序、插入排序、基数排序以及希尔排序和堆排序。 1. **冒泡排序**:这是一种简单的排序算法,通过重复遍历待排序的数列,...
在Java中,我们可以用数组来实现堆排序,下面将详细讲解如何用Java数组实现堆排序。 首先,我们需要创建一个`MaxHeap`类来表示大顶堆。这个类包含以下几个关键方法: 1. `size()`:返回堆中元素的数量。 2. `...
在Java中,可以创建一个方法来实现堆排序,包括建堆和调整堆的过程。这个过程通常涉及对数组的迭代,通过比较和交换元素来满足堆的性质。以下是一个简单的Java代码示例: ```java public class HeapSort { public ...
下面是 Java 语言实现的堆排序算法的关键代码: ```java public class TestHeapSort { public boolean isHeap(int[] a, int i) { int n = a.length; if (i >= n) { return true; } int left = 2 * i + 1; // ...
以下是一个简单的Java代码实现堆排序的例子: ```java public class HeapSort { public void sort(int[] arr) { int n = arr.length; // 构建大顶堆 for (int i = n / 2 - 1; i >= 0; i--) heapify(arr, n, ...
堆通常用于实现优先队列、堆排序等数据结构和算法。在Java中实现堆的操作,主要包括建堆、插入和删除三大功能。下面将详细阐述这三个操作的原理以及如何用Java代码实现它们。 ### 建堆(Heapify) 建堆的操作目的...
本篇文章将深入探讨如何利用堆排序算法对二维数组进行排序,以及如何在Java中实现这一过程。 首先,让我们了解什么是堆排序。堆排序是一种基于比较的排序算法,它利用了数据结构——二叉堆(最大堆或最小堆)的特性...
"堆排序算法详解与实现.pdf"这份文档可能包含了堆排序的详细理论分析、实例演示以及不同编程语言的实现代码。而"项目说明.pdf"可能提供了更多关于如何应用堆排序到实际项目中的指导和注意事项。 总之,堆排序是一种...
本篇博客将深入探讨如何使用Java实现几种经典的排序算法,包括冒泡排序、选择排序、插入排序、快速排序、归并排序以及堆排序。 1. **冒泡排序**: 冒泡排序是一种简单直观的排序算法,通过不断交换相邻的逆序元素...
在"main.java"文件中,你可以看到具体的Java代码实现,这通常会包括定义一个堆类,实现堆的构建、交换、下沉等操作,以及主函数中的排序逻辑。"README.txt"文件可能提供了关于如何编译和运行这个程序的指南,或者...