//堆是一种完全二叉树 就是每个节点都有两个子节点
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));
}
31万+

被折叠的 条评论
为什么被折叠?



