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

堆排序的java实现

2017-11-10 09:50 351 查看
public class MaxHeap {
private Integer[] data;
private int count;
private int capacity;
public  MaxHeap(int capacity){
data = new Integer[capacity+1];
count = 0;
this.capacity = capacity;
}
public MaxHeap(Integer[] arr){
int n = arr.length;
data = new Integer[n+1];
capacity = n;
for(int i=0;i<data.length;i++)
data[i+1] = arr[i];
count = n;
}
public MaxHeap(Integer[] arr,int n){
data = new Integer[n+1];
capacity = n;
for(int i=0;i<n;i++){
data[i+1] = arr[i];
}
count = n;
for(int i=count/2;i>=1;i--){
shifDown(i);
}
}
public int size(){
return count;
}
public boolean isEmpty(){
return count == 0;
}

/**
* 向堆中添加一个元素
* @param data
*/
public void insert(Integer data){
assert count+1 <=capacity;
this.data[count+1] = data;
count++;
shifUp(count);
}

/**
* 取出最大堆中的堆顶元素
*/
public Integer extractMax(){
assert  count > 0;
Integer item = data[1];
swap(data,1,count);
count--;/**减少数组容量*/
shifDown(1);
return item;
}

private void shifDown(Integer k) {
while(2*k<=count){
int j = 2*k;
if(j+1<=count && data[j+1]>data[j]){
j++;
}
if(data[k]>=data[j])
break;
swap(data,k,j);
k = j;
}
}

private void shifUp(int k) {
while(k>1&&data[k/2]<data[k]){
swap(data,k,k/2);
k /= 2;
}
}

public static void swap(Integer[] arr,int i,int j){
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}

public static void main(String[] args) {
Integer[] arr = TestSortHelper.generateRandomArray(10,1,50); //随机生成指定个数指定范围数组的方法
int n = 10;
MaxHeap maxHeap = new MaxHeap(arr,n);
for(int i=n-1;i>=0;i--)
arr[i] = maxHeap.extractMax();
for(int i=0;i<n;i++)
System.out.println(arr[i]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: