堆排序

import java.util.Scanner;


/**
 *堆排序
 *堆积排序是指利用堆积树(堆)这种资料结构所设计的一种排序算法,可以利用数组特点快速定位指定索引
 *的元素,坏时间复杂度为O(nlog2n)
 * @author Administrator
 *
 */
public class sort02 {
    public static void main(String[] args){
     Scanner scanner = new Scanner(System.in);
    System.out.println("请输入数组以空格分开:");
    String str = scanner.nextLine();
    String[] data = str.trim().split("\\s{1,}");//trim 去掉字符串开头和结尾的空格   split  \s表示空格  表示用1个以上的空格分割
    int []a = new int[data.length];
    for(int i=0;i<data.length;i++){
    a[i] =Integer.parseInt(data[i]);
    }
    print(a);
    heapsort(a);
    System.out.println("排序后的数组: ");
    print(a);
    }
    public static void heapsort(int[]data){
    for(int i=0;i<data.length;i++){
    createMaxHeap(data,data.length-1-i);
    int temp = data[0];
    data[0] = data[data.length-1-i];
    data[data.length-1-i] = temp;
    print(data);
    }
    }
    public static void createMaxHeap(int[] data,int lastIndex){
    for(int i=(lastIndex-1)/2;i>=0;i--){
    //保存当前正在判断的节点
    int k = i;
    //若当前节点的子节点存在
    while(2*k+1<=lastIndex){
    //biggerIndex总是记录较大节点的值,先赋值为当前判断节点的左子节点
    int biggerIndex = 2*k+1;
    if(biggerIndex<lastIndex){
    //若右子节点存在,否则此时biggerIndex应该等于lastIndex
    if(data[biggerIndex]<data[biggerIndex+1]){
    //若右子节点值比左子结点值大,则biggerIndex记录的是右子节点的值
    biggerIndex++;
    }
    }
    if(data[k]<data[biggerIndex]){
   
    //若当前节点值比子节点最大值小,则交换两者的值,交换后将biggerIndex值赋值给k
       int temp = data[k];
       data[k] = data[biggerIndex];
       data[biggerIndex] = temp;
       k = biggerIndex;
    }
    else{
    break;
    }
    }
    }
    }
    public static void print(int[] data){
    for(int i=0;i<data.length;i++){
    System.out.print(data[i]+"\t");
    }
    System.out.println();
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值