您的位置:首页 > 其它

堆排序

2014-04-05 11:34 113 查看
package cn.ccnu.lzc;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Random;

public class heapSort {

/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub

int size,j;
System.out.println("enter number of items");
size=getInt();
heap theHeap=new heap(size);
for(j=0;j<size;j++){
int random=new Random().nextInt(100);
Node newNode=new Node(random);
theHeap.insertAt(j, newNode);
theHeap.incrementSize();
}
System.out.print("Random Array:  ");
theHeap.displayArray();
//建堆
for(j=size/2-1;j>=0;j--){
theHeap.trickleDown(j);
}
System.out.print("Heap:  ");
theHeap.displayArray();

for(j=size-1;j>0;j--){
Node biggestNode=theHeap.remove();
theHeap.insertAt(j, biggestNode);
}
System.out.print("Sort: ");
theHeap.displayArray();
}

private static int getInt() throws Exception {
// TODO Auto-generated method stub
String s=getString();
return Integer.parseInt(s);
}

private static String getString() throws Exception {
// TODO Auto-generated method stub
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
String s=br.readLine();
return s;
}

}

class Node{
private int iData;
public Node(int key){
this.iData=key;
}
public int getKey(){
return iData;
}
}

class heap{
private Node[] heapArray;
private int maxSize;    //size of array
private int currentSize;  //number of items in array

public heap(int maxSize){
this.maxSize=maxSize;
heapArray=new Node[maxSize];
currentSize=0;
}

public Node remove()//delete item with max key
{
if(currentSize==0)
return null;
Node root=heapArray[0];
heapArray[0]=heapArray[--currentSize];
trickleDown(0);
return root;
}
//向下构建堆
public void trickleDown(int index){
int largerChild;
Node top=heapArray[index];
while(index<currentSize/2){
int leftChild=2*index+1;
int rightChild=2*index+2;
if(rightChild<currentSize&&heapArray[rightChild].getKey()>heapArray[leftChild].getKey())
largerChild=rightChild;
else
largerChild=leftChild;
if(top.getKey()>=heapArray[largerChild].getKey())
break;
heapArray[index]=heapArray[largerChild];
index=largerChild;
}
heapArray[index]=top;
}

public void displayArray(){
for(Node i:heapArray){
System.out.print(i.getKey()+" ");
}
System.out.println();
}

public void insertAt(int index,Node newNode){
heapArray[index]=newNode;
}
public void incrementSize(){
currentSize++;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: