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));
}
}
分享到:
相关推荐
最优堆排序算法最优堆排序算法最优堆排序算法最优堆排序算法最优堆排序算法最优堆排序算法
简单的堆排序算法:以定长数组为例,动态数组等可以以此类推
堆排序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++写的 逻辑相同 可自行 改为java 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一...
C语言实现的堆排序算法。 提供了堆排序算法的一个接口,可以为其它功能提供功能。
算法 堆的创建与堆排序 堆的创建与堆排序
堆排序算法 java
java的堆排序算法实现程序,含测试,可直接运行。java的堆排序算法实现程序,含测试,可直接运行。
根据算法导论第六章实现的堆排序
算法导论上堆排序算法的vc6.0下的Test实例。
堆排序的源代码; 平台:openSUSE 11.4 编译器:GCC version 4.5.1
// 堆排序 #include typedef int InfoType; // 定义其它数据项的类型 #include "compare.h" #include "sort.h" typedef SqList HeapType; // 堆采用顺序表存储表示 void HeapAdjust(HeapType &H,int s,int m) // ...
用c语言实现堆排序算法,堆排序算法的实现,分析堆排序算法
/交换函数/直接插入排序/冒泡排序/直接选择排序/shell 排序/QSort 快速排序/Restore 重建堆/HeapSort 堆排序等排序算法的实现。
1、 实现堆排序算法。 2、 理论分析并实验验证堆排序算法的时间复杂度。
包含了四种常见的排序算法,是招聘面试时常出的题目,最好自己编译跑一遍
自己编写的堆排序算法实现函数,本人亲测过绝对好使的代码,在这里与大家分享交流,希望能够给你带来帮助