构建堆排序,把新加入的那个数放在堆末尾,然后比较父节点,直到比较的头或者,小于父节点为止
移除,调整堆。移除根节点,把尾节点换头结点。然后根据构建堆一样不停的比较,交换父节点。
堆排序一个完全二叉树,可以用数组实现,节点为i ,左子节点为2i,右子节点为2i+1,
堆排序是用数组实现的,因为数组是一个完全二叉树,所以可以根据一些特性来找到儿子节点。
我们所谓的优先队列的原理其实也就是用堆实现的,在每个语言中都要堆的实现函数,不过在库中她都是以优先队列来呈现的
java 中的实现是这样的
Queue<Integer> queue = new PriorityQueue<>();
这就是一个最大堆
最大堆的定义就是,父节点比儿子节点大
现在我们就来说最大堆的构建insert
就是把插入的一个元素放在堆的末尾,然后不停的跟自己的父元素做比较,如果大于父元素就交换直到到了根元素或者小于父元素的时候截至。最小堆的原理也是如此,只是比较最小的而已。
然后介绍一下,堆的remove的原理
把root元素取出,然后把最后一个元素来代替第一个元素。然后根据insert方法来调整最大堆
调整的过程如下:
末尾的元素移到第一位来,然后判断它的儿子节点是不是比他大,找儿子中比他大且最大的元素进行交换,然后就是边界控制,注意控制越界,因为有可能左孩子没有,只有右孩子
所有的代码入下
package algorithm.sort;
/**
* @author 作者 liwei:
* @version 创建时间:2018年12月19日 上午9:05:31
* 类说明
*/
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class sort2 {
//堆排序在N个元素中选出前M个元素NlogM
public static List<Integer> list = new ArrayList<Integer>();
public static void insert(int v) {
if(list.size()==0) {
list.add(0);
list.add(v);
}
else {
list.add(v);
}
int len =list.size()-1;
while(len>1&&list.get(len)>list.get(len/2)) {
int temp = list.get(len);
list.set(len, list.get(len/2));
list.set(len/2, temp);
len /=2;
}
}
public static int remove() {
int root=list.get(1);
int len =list.size()-1;
int temp = list.get(len);
list.set(1, temp);
list.remove(len);
len--;
int start =1;
while(2*start<=len) {
boolean flag = true;
if(2*start+1>len) {
if(list.get(start)<list.get(2*start)) {
temp =list.get(2*start);
list.set(2*start, list.get(start));
list.set(start, temp);
start=2*start;
flag=false;
}
}
else {
if(list.get(start)<list.get(2*start)||list.get(start)<list.get(2*start+1)) {
if(list.get(2*start)>list.get(2*start+1)) {
temp =list.get(2*start);
list.set(2*start, list.get(start));
list.set(start, temp);
start=2*start;
flag=false;
}
else {
temp =list.get(2*start+1);
list.set(2*start+1, list.get(start));
list.set(start, temp);
start=2*start+1;
flag=false;
}
}
}
if(flag==true) {
break;
}
}
return root;
}
public static void main(String[] args) {
Random rand = new Random();
for(int i=0;i<100;i++) {
sort2.insert(rand.nextInt(1000));
}
for (Integer i : sort2.list) {
System.out.print(i+" ");
}
System.out.println();
for(int i=1;i<=100;i++) {
int remove = sort2.remove();
System.out.print(remove+" ");
}
System.out.println();
}
}
j