树与堆排序

大根堆,根最大。左孩子 2n+1,右孩子2n+2(堆排序实现是数组)
在这里插入图片描述

堆排序

package Sort;

/**
 * @author: 贾兴伟
 * @date: Created in 21:33 2020/12/8
 */
public class Heapsort {
    
    
    //用二叉树的概念
    //heapsort这个函数的作用就是找到一部分树的最大并把它放到end处。
    public static void heapsort(int[] array,int start,int end){
    
    
        //树有下标,这里创建一个起始下标,和终止下标。
        //将start下标的元素存放在变量tmp里。
        int tmp =array[start];
        //这里的循环是找儿子的过程
        for(int i =2*start+1;i<=end;i=2*i+1){
    
    
            if(i+1<=end&&array[i]<array[i+1]){
    
    
                //左儿子比右儿子小i就++到右儿子位置
                i++;
            }
            //tmo保存的都是要比较的根的值
            if(array[i]>tmp) {
    
    
                //儿子比根大就把儿子放到根处,即start处。
                array[start] = array[i];
                //继续往下找,start更新到i;
                start = i;
            }else {
    
    
                break;
            }
        }
        //最后把存在tmp的根的值放到更新到的i的位置。
        array[start]=tmp;
    }
    //从右下方最小部分树开始排序,叶子每次都对比到end处。
    public static void beginsort(int[] array){
    
    
        for (int i=(array.length-1-1)/2;i>=0;i--){
    
    
            //为什么end是array.length-1?
            heapsort(array,i,array.length-1);
        }
        //heapsort函数将最大的值放到了最前面所以写个循环让他们从小到大
        for (int i=0;i<array.length;i++){
    
    
            int tmp =array[0];
            array[0]=array[array.length-1-i];
            array[array.length-1-i]=tmp;
            heapsort(array,0,array.length-1-i-1);
        }
    }
    public static void show(int array[]){
    
    
        for(int i=0;i<array.length;i++){
    
    
            System.out.print(array[i]);
        }
        System.out.println(" ");
    }
    public static void main(String[] args) {
    
    
        int[] arr1 =new int[]{
    
    8,5,4,9,7,2,1,5,6,4};
        int[] arr2 =new int[]{
    
    2,8,4,6,8,7,2,6};
        int[] arr3 =new int[]{
    
    5,7,9,4,5,7,5,6,3,1,7,2,8,4};
        beginsort(arr1);
        beginsort(arr2);
        beginsort(arr3);
        show(arr1);
        show(arr2);
        show(arr3);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_47198561/article/details/111311870