package net.com.heap;
import java.util.Arrays;
public class HeapSort {
/*
* fun将给定的一个数组创建成大頂堆
* array代表给定的数组,right代表数组的最大下标值
* */
public void createHeap(int[] array,int right){//创建大頂堆
int middle=right%2==0?right/2-1:right/2;
if(middle*2+2>right){//末尾的叶子节点不对称的情况
if(array[middle]<array[middle*2+1]){
int temp=array[middle];
array[middle]=array[middle*2+1];
array[middle*2+1]=temp;
}
middle=middle-1;
}
for(int i=middle;i>=0;i--){
if(array[i]<array[i*2+1] || array[i]<array[i*2+2]){
adjustHeap(array,right,i);
}
}
}
/*
* fun调整堆,使堆再次成为一个大頂堆
* array代表要调整的数组
* right代表数组的最大下标值
* currentIndex代表当前的不符合的节点的索引值
*/
public void adjustHeap(int array[],int right,int currentIndex){
while(currentIndex < right/2 && currentIndex*2+2<=right){
int leftChild=array[currentIndex*2+1];
int rightChild=array[currentIndex*2+2];
if(array[currentIndex] > leftChild && array[currentIndex] > rightChild){
break;
}else{
int temp=array[currentIndex];
int tempIndex=leftChild>rightChild?currentIndex*2+1:currentIndex*2+2;
array[currentIndex]=array[tempIndex];
array[tempIndex]=temp;
currentIndex=tempIndex;
}
}
if(currentIndex*2+2>right&¤tIndex<right/2){//对于节点不对称的情况进行的处理
if(array[currentIndex]<array[currentIndex*2+1]){
int temp=array[currentIndex];
array[currentIndex]=array[currentIndex*2+1];
array[currentIndex*2+1]=temp;
}
}
}
public void swap(int array[],int right){//将大頂堆的最大数与最后一个数作交换。
int temp=array[right];
array[right]=array[0];
array[0]=temp;
}
public void heapSort(int[]array,int right){
if(right>0){
swap(array,right);
adjustHeap(array,right-1,0);
heapSort(array,right-1);
}
/*if(array[1]<array[0]){
int temp=array[0];
array[0]=array[1];
array[1]=temp;
}*/
}
public static void main(String[]args){
HeapSort heapSort=new HeapSort();
int[] array={3,2,34,5,7,8,42,5};
int len=array.length;
heapSort.createHeap(array,len-1);
heapSort.heapSort(array, len-1);
System.out.println(Arrays.toString(array));
}
}
分享到:
相关推荐
十大经典排序算法堆排序详细图解(通俗易懂)十大经典排序算法堆排序详细图解(通俗易懂)十大经典排序算法堆排序详细图解(通俗易懂)十大经典排序算法堆排序详细图解(通俗易懂)十大经典排序算法堆排序详细图解...
### c语言实现堆排序算法 堆排序是一种基于比较的排序算法,它利用了二叉堆的数据结构特性来高效地对数据进行排序。堆排序可以分为最大堆和最小堆两种,其中最大堆指的是父节点的值总是大于或等于任意一个子节点的...
简单的堆排序算法:以定长数组为例,动态数组等可以以此类推
本主题将深入探讨四种常见的排序算法:堆排序、快速排序以及两种未在标题中明确提到但同样重要的排序方法——基数排序和计数排序。 首先,让我们详细了解一下堆排序。堆排序是一种基于比较的排序算法,利用了数据...
堆排序是一种常用的排序算法,它使用大堆进行排序。下面是堆排序的详细知识点说明: 堆排序定义 堆排序是一种比较排序算法,它使用大堆(max heap)来对数组进行排序。堆排序的时间复杂度为O(n log n),空间复杂度...
【堆排序算法详解】 堆排序是一种高效的比较排序算法,其主要思想是利用堆这种数据结构进行数据的排序。堆是一个近似完全二叉树的结构,同时满足堆的性质:即父节点的键值总是大于或等于(在最大堆中)或小于或等于...
堆排序是一种基于比较的排序算法,它通过构造一个大顶堆或小顶堆来实现排序。在本场景中,我们关注的是堆排序的源代码,它适用于openSUSE 11.4操作系统,并且是使用GCC version 4.5.1编译器编译的。在这个名为"sort...
堆排序是一种基于比较的排序算法,它通过构造一个近似完全二叉树的堆数据结构来实现排序。在计算机科学中,堆是一个可以被看作是一棵树形结构的数据集合,其中每个父节点的值都大于或等于其子节点的值(大顶堆)或...
堆排序算法是一种高效的排序算法,它的工作原理是通过将数组转换成堆,然后将堆的根节点作为排序的结果。堆排序算法的时间复杂度为O(n log n),因此它适合大规模的数据排序。 7.二叉树排序算法 二叉树排序算法是一...
堆排序:应用Java和Python分别实现堆排序算法; 堆排序:应用Java和Python分别实现堆排序算法; 堆排序:应用Java和Python分别实现堆排序算法; 堆排序:应用Java和Python分别实现堆排序算法; 堆排序:应用Java和...
堆排序11.cpp 使用C++实现堆排序11.cpp 使用C++实现堆排序11.cpp 使用C++实现堆排序11.cpp 使用C++实现堆排序11.cpp 使用C++实现堆排序11.cpp 使用C++实现堆排序11.cpp 使用C++实现堆排序11.cpp 使用C++实现堆排序11...
堆排序13.py 使用python代码实现堆排序13.py 使用python代码实现堆排序13.py 使用python代码实现堆排序13.py 使用python代码实现堆排序13.py 使用python代码实现堆排序13.py 使用python代码实现堆排序13.py 使用...
堆排序12.java 使用java代码实现堆排序12.java 使用java代码实现堆排序12.java 使用java代码实现堆排序12.java 使用java代码实现堆排序12.java 使用java代码实现堆排序12.java 使用java代码实现堆排序12.java 使用...
本文将深入探讨四种在C++中实现的常见排序算法:插入排序、冒泡排序、堆排序和快速排序。这些算法各有特点,适用于不同的场景,理解并掌握它们对于提升编程能力至关重要。 1. **插入排序**: 插入排序是一种简单的...
堆排序是一种基于比较的排序算法,它通过构造一个近似完全二叉树的堆结构来实现数据的排序。在此,我们将深入探讨堆排序的基本概念、原理以及如何通过编程实现。 一、堆排序的概念 堆是一个近似完全二叉树的结构,...
堆排序详细图解(通俗易懂)+排序算法----堆排序(超详细)堆排序详细图解(通俗易懂)+排序算法----堆排序(超详细)堆排序详细图解(通俗易懂)+排序算法----堆排序(超详细)堆排序详细图解(通俗易懂)+排序算法...
一个堆排序算法 c++写的 逻辑相同 可自行 改为java 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一...
C语言实现的堆排序算法。 提供了堆排序算法的一个接口,可以为其它功能提供功能。
堆排序算法 java
最优堆排序算法最优堆排序算法最优堆排序算法最优堆排序算法最优堆排序算法最优堆排序算法