您的位置:首页 > 其它

堆排序

2015-10-19 19:43 323 查看
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();

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: