Just_remember 2014-02-27 10:13 采纳率: 0%
浏览 820

谁能告诉我这个是二叉树排序吗

import java.util.Arrays;
public class HeapSort {
int a[]={49,38,65,97,76};
public HeapSort(){
heapSort(a);
}
public void heapSort(int[] a){
System.out.println("开始排序");
int arrayLength=a.length;
//循环建堆
for(int i=0;i<arrayLength-1;i++){
//建堆
buildMaxHeap(a,arrayLength-1-i);
//交换堆顶和最后一个元素
swap(a,0,arrayLength-1-i);
System.out.println(Arrays.toString(a));
}
}

private  void swap(int[] data, int i, int j) {
    // TODO Auto-generated method stub
    int tmp=data[i];
    data[i]=data[j];
    data[j]=tmp;
}
//对data数组从0到lastIndex建大顶堆
private void buildMaxHeap(int[] data, int lastIndex) {
    // TODO Auto-generated method stub
    //从lastIndex处节点(最后一个节点)的父节点开始
    for(int i=(lastIndex-1)/2;i>=0;i--){
        //k保存正在判断的节点
        int k=i;
        //如果当前k节点的子节点存在
        while(k*2+1<=lastIndex){
            //k节点的左子节点的索引
            int biggerIndex=2*k+1;
            //如果biggerIndex小于lastIndex,即biggerIndex+1代表的k节点的右子节点存在
            if(biggerIndex<lastIndex){
                //若果右子节点的值较大
                if(data[biggerIndex]<data[biggerIndex+1]){
                    //biggerIndex总是记录较大子节点的索引
                    biggerIndex++;
                }
            }
            //如果k节点的值小于其较大的子节点的值
            if(data[k]<data[biggerIndex]){
                //交换他们
                swap(data,k,biggerIndex);
                //将biggerIndex赋予k,开始while循环的下一次循环,重新保证k节点的值大于其左右子节点的值
                k=biggerIndex;
            }else{
                break;
            }
        }
    }
}

}

谁能告诉我这个是二叉树排序吗,谢谢 我的要求就是一个数组(int类型) 生成二叉树对其排序

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-01 19:32
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这是一个简单的Java程序,它使用了堆排序算法来对一个整数数组进行升序排序。堆排序是一种基于分治策略的高效排序方法。

    首先,我们创建一个HeapSort类,并在其中实现heapSort()方法,该方法接受一个整数数组作为参数。在这个方法中,我们首先打印出"开始排序"的消息,然后调用buildMaxHeap()方法来构建最大堆,最后通过swap()方法交换堆顶和最后一个元素,以完成排序。

    以下是一个完整的示例:

    public class Main {
        public static void main(String[] args) {
            int[] arr = {49, 38, 65, 97, 76};
            new HeapSort().heapSort(arr);
            System.out.println(Arrays.toString(arr));
        }
    
        public void heapSort(int[] arr) {
            // 建立最大堆
            buildMaxHeap(arr);
            // 交换堆顶和最后一个元素
            swap(arr, 0, arr.length - 1);
            // 输出排序后的数组
            System.out.println(Arrays.toString(arr));
        }
    
        private void buildMaxHeap(int[] arr) {
            // 从倒数第二个节点开始向上调整
            for (int i = arr.length / 2 - 1; i >= 0; i--) {
                maxHeapify(arr, i, arr.length);
            }
        }
    
        private void maxHeapify(int[] arr, int index, int length) {
            int leftChild = 2 * index + 1;
            int rightChild = 2 * index + 2;
            int largest = index;
    
            // 如果左孩子存在且大于根节点,则更新最大节点为左孩子
            if (leftChild < length && arr[leftChild] > arr[largest]) {
                largest = leftChild;
            }
            // 如果右孩子存在且大于左孩子的值,则更新最大节点为右孩子
            if (rightChild < length && arr[rightChild] > arr[largest]) {
                largest = rightChild;
            }
            // 如果最大节点不等于根节点,则交换并继续向下调整
            if (largest != index) {
                swap(arr, index, largest);
                maxHeapify(arr, largest, length);
            }
        }
    
        private void swap(int[] arr, int i, int j) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    

    在这个程序中,我们首先定义了一个Main类,其中包含main方法,这是程序的入口点。然后,在main方法中,我们创建了一个整数数组arr,并实例化了一个HeapSort对象。接着,我们调用了heapSort()方法对数组进行排序。

    请注意,这个程序只实现了堆排序的基本思想,没有实际的代码用于构建和维护最大堆。如果你想要一个完整的堆排序实现,你可能需要自己编写一些辅助函数来处理构建、修改和维护最大堆的过程。

    评论

报告相同问题?