您的位置:首页 > 编程语言 > Java开发

Java 堆排序

2015-08-21 14:12 375 查看
public class Heap {

/**
* 根据给定的数组以及  数组的取值范围  lastIndex 构造大顶堆;
* 步骤:
* 1.从最后一个非叶子节点((lastIndex-1)/2)开始往上遍历所有的非叶子节点((lastIndx-1)/2,.....,0)
* 2.对于每一个非叶子节点K
* 	 2.1  判断是否含有孩子节点,并找到比K节点值大的最大的孩子节点(bigger),没有则退出
* 	 2.2 交换 K 节点 与 bigger 节点的值
*   2.3 K节点变为bigger节点,并返回 2.1
* */
public static void buildMaxHeap(int[] data, int lastIndex){

for(int i=(lastIndex-1)/2; i>=0; i--){
int k=i;
/**
* 	数组的数据[0,1,2,......,lastIndex-1]
* */
while(k*2+1<lastIndex){	//如果当前节点K 节点的的子节点存在存在一个
int left = 2*k+1;
int right = 2*k+2;
int bigger;
if(right<lastIndex)  //存在右孩子节点
bigger = data[left] > data[right] ? left:right;
else				//只存在左孩子节点
bigger = left;
if(data[k]>= data[bigger])  //如果两个孩子的值都比父节点的值小,不需要交换,退出
break;
else{
int tep = data[k];
data[k] = data[bigger];
data[bigger] = tep;
k  = bigger;
}
}
}
}
/**
*  堆排序 给定数组data[]
*  int k = data.length
*  步骤:
*  1.构造大顶堆
*  2.输出第一个元素(最大值)
*  3.交换第一元素,最后一个元素
*  4.构造大顶堆的数组范围减  1 ,返回  1
* */
public static void HeapSort(int[] data){
int k = data.length;
int t= k;
for(int i=0; i<k;i++){
buildMaxHeap(data,t);
System.out.print(data[0]+" ");
int tep = data[0];
data[0] = data[k-i-1];
data[k-i-1] = tep;
t--;
}
}

public static void main(String[] args){

int[] data = {34,21,3,4,5,67,89,90,35};
Heap.HeapSort(data);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: