栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

堆排序,删除堆中任意单一元素

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

堆排序,删除堆中任意单一元素

package headSort;
import java.util.Arrays;
public class MyHeap {
    public int[] arr;
    public int size;
    public MyHeap(int[] arr) {
        this.arr = arr;
        this.size=arr.length;
    }
    
    public void delete(int i){
        int deletevalue = arr[i];
        int pop = pop();
        if (i!=0)        increasevalue(arr,deletevalue,pop);
    }
    public int pop(){
        int popValue = arr[0];
        swap(arr,0,arr.length-1);
        size--;
        arr=Arrays.copyOf(arr,size);
        headify(0, size);
        return popValue;
    }
    private void increasevalue(int[] a,int deletevalue,int k){
        // 一定是变大
        int i = 0 ;
        while (arr[i]!=deletevalue) i++;
        arr[i]=k;
        // 上浮
        int parentIndex;
        while ((parentIndex=parent(i)) >= 0 && a[i]>a[parentIndex]){
            swap(a,parentIndex,i);
            i=parentIndex;
        }
    }
    public void headSort() {
        for (int i = (size - 1) / 2 ; i >= 0; i--)
            headify(i,size);//为什么这个时候length不用-1 ->因为这个时候需要全部节点都要考虑

        for (int i = size - 1; i >= 0; i--) {
            swap(arr, i, 0);//将第一元素移动到最后->堆顶元素是最大元素->这样一来就不用管最后的元素了,排序从后往前排
            //为什么这个时候不用考虑最后一个节点->因为这个时候最后一个节点已经有序了不用管了
            headify(0,i);
        }
    }
    private void headify (int i,int length) {
        int largest = i;
        int leftson = 2 * i + 1;
        int rightson = 2 * i + 2;
        if (leftson < length) largest = (arr[largest] > arr[leftson]) ? largest : leftson;
        if (rightson < length) largest = (arr[largest] > arr[rightson]) ? largest : rightson;
        if (largest != i) { //largest是更最大值交换的位置
            swap(arr,largest,i);
            headify(largest,length);
        }
    }
    private void swap(int[] a, int i, int j) {
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
    public void print_ln(){
        for (int i = 0 ; i < size ; i ++){
            if (i==0) {System.out.print(" [ " + arr[i] + "  ");continue;}
            if (i == size - 1){
                System.out.println( arr[i]  + " ] ");
                break;
            }
            System.out.print( arr[i] + "  ");
        }
    }
    private int parent(int i){
        return (i%2==0)?i/2-1:i/2;
    }
    public static void main(String[] args) {
        MyHeap myHeap = new MyHeap(new int[]{10, 9, 3, 8, 5, 1, 2, 7, 6});
        myHeap.delete(2);
        myHeap.print_ln();
        myHeap.headSort();
        myHeap.print_ln();
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/763596.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号