• Java实现堆排序


     1 import java.util.Scanner;
     2 
     3 /*堆是一种数据结构,类似于一棵完整的二叉树。
     4  * 思想:堆的根节点值最大(最小),将无序序列调整成一个堆,就能找出这个序列的最大值(最小值),将找出的值交换到序列的最后或最前,
     5  * 这样有序序列元素增加1个,无序序列元素减少1个,对新的无序序列重复这样的操作,就实现了排序。即:1.建堆2.排序
     6  * 对排序过程(大顶堆):
     7  * (1)从无序序列所确定的完全二叉树的第一个非叶子节点(n/2)开始,从右到左,从下到上,对每个节点进行调整,最终的到大顶堆
     8  * 对节点的调整方法:将当前节点(a)的值与其孩子节点进行比较,如果存在大于a的孩子节点,从中选出最大的的一个和a进行交换,当
     9  * a到下一层时重复上述过程,直到a的孩子节点值都小于a为止
    10  * (2)将当前无序序列的第一个元素(a),即树的根节点与当前无序序列的最后一个元素(b)交换。a进入有序序列,达到最终位置。
    11  * 无序序列中元素减少1个,有序序列中元素增加1个,此时只有节点b不满足堆定义,对它进行调整
    12  * (3)重复(2)中过程,直到无序序列中的元素剩下一个时排序结束
    13  ** 时间复杂度O(nlog2(n))[2是底]
    14  ** 空间复杂度O(1)*/
    15 /*适合记录多的排序*/
    16 /*将array[0,...,n-1]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲节点和孩子结点之间的内在关系.*/
    17 public class heapsort {
    18 
    19     public static void main(String[] args){
    20         Scanner cin = new Scanner(System.in);
    21         String str = cin.nextLine();
    22         String[] st = str.split(" ");
    23         int[] c = new int[st.length+1];
    24         for(int i=0;i<st.length;i++){
    25             c[i+1]=Integer.parseInt(st[i]);
    26         }
    27         sort(c);
    28         for(int i=1;i<c.length;i++){
    29             System.out.print(c[i]);
    30             System.out.print(" ");
    31         }
    32         
    33         cin.close();
    34     }
    35     //完成R[low]到R[high]范围内对low的调整
    36     //默认R是一个完全二叉树的顺序存储
    37     public static void sift(int[] R,int low,int high){
    38         int i=low,j=i*2;
    39         int temp = R[i];;
    40         while(j<=high){ 
    41             if(j<high&&R[j]<R[j+1]){
    42                 j++;
    43             }
    44             if(temp<R[j]){
    45                 R[i]=R[j];
    46                 i=j;
    47                 j=2*i;
    48             }else{
    49                 break;
    50             }
    51         }
    52         R[i]=temp;
    53     }
    54     //堆排序
    55     public static void sort(int[] R){
    56         int i,j;
    57         int n = R.length-1;
    58         int temp;
    59         for(i=n/2;i>=1;--i){//初始化(大根)堆
    60             sift(R,i,n);
    61         }
    62         //堆排序
    63         for(j=n;j>=2;j--){
    64             temp=R[1];
    65             R[1]=R[j];
    66             R[j]=temp;
    67             sift(R,1,j-1);
    68         }
    69     }
    70 }
  • 相关阅读:
    equals标准写法
    抽象类的概述
    多态的弊端
    多态
    final关键字
    java 静态代码块 构造块 构造方法
    java 工具类
    逻辑运算符&&和&的区别 ||和|的区别
    react-route
    跨域
  • 原文地址:https://www.cnblogs.com/Janejxt/p/5829716.html
Copyright © 2020-2023  润新知