//堆是一种完全二叉树 就是每个节点都有两个子节点
public static void maxHeapSort(int[] arrays,int node,int size){
//获取左节点和右节点位置
int left = node*2+1;
int right = node * 2 +2 ;
//假设node 是最大
int max = node;
//判断左节点有没有大于父节点
if(left < size){//没有超出最大位置
if(arrays[left] > arrays[max]){
//记录max位置
max = left;
}
}
if(right < size){
if(arrays[right] > arrays[max]){
max =right;
}
}
//如果max 大于根节点 就交换位置
if(arrays[max] > arrays[node]){
int temp = arrays[max];
arrays[max] = arrays[node];
arrays[node] = temp;
//继续建堆 交换位置之后可能该结点的子节点 没有达到要求 所有会递归调用 这里只是排序 每次取值取顶点 所以不需要递归调用了
// maxHeapSort(arrays,max,size);
}
}
public static void maxHeapify(int[] arrays, int size) {
// 从数组的尾部开始,直到第一个元素(角标为0)
for (int i = size - 1; i >= 0; i--) {
maxHeapSort(arrays, i, size);
}
}
public static void main(String[] args) {
Random r = new Random();
int [] a = new int[1_000_00];
for(int i=0;i<a.length;i++){
a[i] = r.nextInt(1_000_000);
}
long l = System.currentTimeMillis();
for(int j = 0 ;j<a.length ;j++){//50005000
maxHeapify(a, a.length - j);
int temp = a[0];
a[0] = a[(a.length - 1) - j];
a[(a.length - 1) - j] = temp;
}
System.out.println("堆排序"+(System.currentTimeMillis() -l));
}
最小堆排序
public static void smallHeapSort(int[] array,int node,int size){ int left = node *2 +1; int right = node *2 +2; int min = node; if(left < size){ if(array[left] < array[node]){ min = left; } } if(right < size){ if(array[right] < array[min]){ min = right; } } if(array[min] < array[node]){ int temp = array[node]; array[node] = array[min]; array[min] = temp; //smallHeapSort(array,min,size); } } //每一块都需要重新建堆 public static void rebuildHeap(int[] array,int size){ for(int i= size-1 ; i >=0 ; i--){ smallHeapSort(array,i,size); } } public static void main(String[] args) { Random r = new Random(); int[] a =new int[10]; for(int i=0;i<10 ;i++){ a[i] = r.nextInt(100); } System.out.println(Arrays.toString(a)); //每次把堆首放在末尾即可降序 for(int j = a.length ;j >=0 ;j--){ rebuildHeap(a,j); //换位置 if(j !=0){ int t = a[0]; a[0] = a[j-1]; a[j-1] = t; } } System.out.println(Arrays.toString(a)); }