堆排序算法实现

`

public class Heap {

private List<Integer> heap;
private int size;

public static void main(String[] args) {
    Random rand = new Random(47);

    List<Integer> list = new ArrayList<>();
   for (int i=0; i<10; i++) {
        list.add(rand.nextInt(100));
    }
    for (int i=0; i<list.size(); i++) {
       System.out.print(list.get(i) + " ");
    }
    System.out.println();
    Heap_last heap = new Heap(list);
    heap.trav();
    heap.heapSort();
    heap.trav();
}

public Heap(List list) {   //构造既建堆
    if (list == null)
        throw new IllegalArgumentException("list is null");
    heap = list;
    size = list.size();
    for (int i=size/2; i>=0; i--)
        precolateDown(i);
}

public void heapSort() { //堆排序
    size = size - 1; //size先充当数组的哨兵
    while (size > 0) {
        swap(0, size--); //最大元素交换到最末尾
        precolateDown(0); //对首元素进行下滤
    }
    size = heap.size(); //还原size
}

private void precolateDown(int i) { //下滤算法
    int left = (i << 1) + 1;
    int right = (i+1) << 1;
    int largest = i;
    while (true) {
        if (left < size && get(i) < get(left)) {
            largest = left;
        }
        if (right < size && get(largest) < get(right)) {
            largest = right;
        }
        if (largest != i) {
            swap(i, largest);
            i = largest;
        } else {
            break;
        }
        left = (i << 1) + 1;
        right = (i+1) << 1;
    }
}

private Integer get(int index) {
    return heap.get(index);
}

public void set(int index, Integer element) {
    heap.set(index, element);
}

public void swap(int index1, int index2) {
    Integer temp = get(index1);
    heap.set(index1, get(index2));
    heap.set(index2, temp);
}

public void trav() {
    for (int i=0; i<heap.size(); i++)
        System.out.print(heap.get(i) + " ");
    System.out.println();
}

} `

转载于:https://my.oschina.net/u/3737002/blog/3101244

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值