首页 > 试题广场 >

排序(堆排序)

[编程题]排序(堆排序)
  • 热度指数:4235 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给你一个n代表有n个数字,然后你需要使用堆排序将这些数字从小到大排好。

输入描述:
第一行输入一个n,代表有n个数字
第二行输入n个数


输出描述:
输出排序好后的n个数
示例1

输入

4
4 3 2 1

输出

1 2 3 4
import java.util.*;
public class Main {
    public static void main(String[] arg){
        Scanner in =new Scanner(System.in);
        int n=in.nextInt();
        int[] nums=new int[n];
        for(int i=0;i<n;i++){
            nums[i]=in.nextInt();
        }
        
        heapSort(nums);
        
    }
    public static void heapSort(int[] nums){
        int n=nums.length;
        for(int i=n/2-1;i>=0;i--){
            //从最后一个非叶子节点开始调整
            heapAdjust(nums,i,n);
        }
        for(int i=n-1;i>0;i--){
            swap(nums,0,i);
            heapAdjust(nums,0,i);
        }
        
        for(int i=0;i<n;i++){
            System.out.print(nums[i]+" ");
        }
        
    }
    //将根节点沉入已构建的大顶堆
    public static void heapAdjust(int[] nums,int i,int n){
        for(int k=2*i+1;k<n;k=2*k+1){//找左节点
            if(k+1<n&&nums[k+1]>nums[k]){
                //右节点更大则换为右节点  更大的往上浮
                k++;
            }
            if(nums[k]>nums[i]){
                swap(nums,i,k);
                i=k;
            }else
                break;
        }  
    }
    public static void swap(int[] nums,int i,int j){
        int temp=nums[i];
        nums[i]=nums[j];
        nums[j]=temp;
        return;
    }
}

发表于 2021-03-27 16:02:44 回复(0)