继上一篇,堆的实现,PS:上次的代码没有判断堆是否为空=。=
回归正题,无论是最大堆还是最小堆,只要一直取数,把堆取空,那么取出的数列一定是有序的(从大到小或从大到小),因此堆排序就是用待排的数据建个堆,然后不断取数,取到空,就好了。
上代码:
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
/**
* Created by Lee Y on 2016/4/2.
* 最小堆JAVA实现
*/
public class CompleteTree {
private Vector<Integer> list = new Vector<>();
private static final int start = 1;
private int end = start;
public CompleteTree(){
addLength();
}
/*
插入
*/
public void insert(Integer item){
if(end == list.size()){
addLength();
}
list.set(end, item);
insert_adapt();
end++;
}
/*
增加vector的长度,并初始化,vector虽然是动态的,但set方法不是动态的(add方法可以动态增加长度)
对于某些情况叶子节点可能会取空,所以应该手动增加长度。
*/
private void addLength(){
for (int i=0;i<100;i++){
list.add(0xfffffff);
}
}
/*
插入调整
*/
private void insert_adapt(){
int pos = end;
Integer a,b;
while(pos != 1){
a = list.get(pos);
b = list.get(pos>>1);
if(a.intValue() < b.intValue()){
list.set(pos>>1, a);
list.set(pos, b);
}
pos >>= 1;
}
}
/*
取数调整
*/
private void adapt(int c, int deep, int maxDeep){
if(deep == maxDeep) return;
else{
int front = c<<1;
int back = (c<<1)+1;
Integer a = list.get(front);
Integer b = list.get(back);
Integer t = list.get(c);
int i=a.intValue(),j=b.intValue(),k=t.intValue();
if (k > i || k > j){
if(i > j){
list.set(c, b);
list.set(back, t);
adapt(back,deep+1,maxDeep);
}else{
list.set(c, a);
list.set(front, t);
adapt(front,deep+1,maxDeep);
}
}
return;
}
}
/*
计算当前堆的深度
*/
private int getDeep(){
int i=0,c;
while(true){
c = 1<<i;
i++;
if(end <= c+c-1){
break;
}
}
return i;
}
/*
取出堆顶
*/
public Integer top(){
Integer t = list.get(start);
list.set(start, list.get(--end));
list.set(end,0xfffffff);
int c = getDeep();
adapt(start,1,c);
return t;
}
/*
打印整个树,从上至下
*/
public void print(){
int hh = 1,weight = 0;
for(int i=1;i<end;i++){
System.out.print(list.get(i) + " ");
if(i == hh){
System.out.println();
hh += (2<<weight);
weight++;
}
}
System.out.println();
}
public boolean isEmpty(){
if(end == 1){
return true;
}
else return false;
}
public static void main(String[] args) {
CompleteTree heap = new CompleteTree();
int[] q = {1,10,11,9,6,7,15,2,3,16};
int[] qq = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
int[] qqq = {10,2,5,12,6,7,1,9,9,10,1,15,19,25,3,5,8};
for(int i : qqq){
heap.insert(i);
}
while(!heap.isEmpty()){
System.out.println(heap.top());
}
}
}