堆排序

来源:互联网 发布:淘宝助理安卓手机版5.7 编辑:程序博客网 时间:2024/06/06 07:38
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
原创粉丝点击