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

java实现堆排序

2014-06-24 07:38 218 查看
import java.util.Random;

/**
* 堆排序
* 堆排序定义:n个关键字序列Kl,K2,…,Kn称为堆,当且仅当该序列满足如下性质(简称为堆性质):
 (1) ki≤K2i且ki≤K2i+1 或(2)Ki≥K2i且ki≥K2i+1(1≤i≤ )
*/
public class HeapSort {

public static int N = 20;       //数组的长度
/**
*
* @param R 待排序数组
*/
private void buildHeap(int[] R){
int length = R.length;
int begin = length/2 -1;        //The last leaf node

for(int i=begin;i>=0;i--)
{

heapify(R,length,i);        //adjust heap
}
}
/**
* 调整无序为一个新的堆
* @param R 待调整数组R
* @param start 调整数组的无序
* @param end  调整数组的无序区结束位置
*/
private void heapify(int[] R,int hlen,int i){
int left =2*i+1;            //节点i的左孩子节点
int right =2*i+2;           //节点i的右孩子节点
int largest = i;
int temp;

while(left<hlen || right<hlen){
if(left<hlen && R[largest]<R[left]){
largest = left;
}

if(right<hlen && R[largest]<R[right]){
largest = right;
}

if(i !=largest){                //如果最大值不是父节点,则交换父节点和拥有最大值的子节点交换
temp=R[largest];
R[largest]=R[i];
R[i] =temp;

i = largest;            //新的父节点,以备迭代调堆
left = 2*i+1;           //新的子节点
right =2*i+2;
}
else{
break;
}
}
}
/**
* 打印输出数组数据
* @param R
*/
private void printArray(int[] R){
int length = R.length;
for(int i=0;i<length;i++){
System.out.print(R[i]+",");
if((i+1)%20==0)
System.out.println();
}
System.out.println();
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
HeapSort obj = new HeapSort();  //堆排序

Random ran = new Random();
int[] R = new int
;       //声明n+1个数组,R[0]作为交换位
for(int i=0;i<N;i++)
{
R[i]=ran.nextInt(100);    //
}
obj.printArray(R);

int hlen = R.length;
int temp;
//obj.printArray(R);            //初始化后的输出
obj.buildHeap(R);           //init heap
//  obj.printArray(R);            //构建堆后的输出
obj.printArray(R);
while(hlen>1){
temp = R[hlen-1];
R[hlen-1] = R[0];
R[0] =temp;
hlen--;             //堆的大小减一
obj.heapify(R, hlen, 0);  //修改后重新调整堆
//   obj.printArray(R);
}
// System.out.println(hlen);
obj.printArray(R);
// System.out.println("堆排序流程");
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐