java实现简单排序算法:堆排序

来源:互联网 发布:下载游戏的软件 编辑:程序博客网 时间:2024/05/21 10:46
  1. 构建一个大顶堆。
  2. 依次获取大顶堆的第一个元素,即当前未排序子序列中最大元素。
  3. 注意:沿关键字较大的孩子节点向下筛选,防止调换后破坏较大孩子 节点的结构(较大孩子节点大于自身左右子节点)
package SortTest;import java.util.Scanner;public class HeapSort {    /**     * 堆排序     * @param args     */    static void HeapSort(int[] a) {        int i;        //构建一个大顶堆        for (i = a.length / 2; i > 0; i--) {            HeapAdjust(a, i, a.length);        }        //依次获取大顶堆的第一个元素,即当前未排序子序列中最大元素        for (i = a.length-1; i > 0; i--) {            swap(a, 0, i);  //将堆顶记录与未排序的子序列的最后一个元素交换            HeapAdjust(a, 0, i - 1);//将剩下的未排序子序列再次构建大顶堆        }    }    private static void swap(int[] a, int i, int i2) {        int temp = a[i];        a[i] = a[i2];        a[i2] = temp;    }    private static void HeapAdjust(int[] a, int i, int length) {        int temp, j;        temp = a[i];        for (j = 2 * i; j < length; j *= 2) {  //沿关键字较大的孩子节点向下筛选,防止调换后破坏较大孩子节点的结构(较大孩子节点大于自身左右子节点)            if (j < length && a[j] < a[j + 1])                ++j;            if (temp >= a[j])                break;            a[i] = a[j];            i = j;        }        a[i] = temp;    }    public static void main(String[] args) {        // 读入指定长度的数组        Scanner sca = new Scanner(System.in);        int count = sca.nextInt();        int[] a = new int[count];        for (int i = 0; i < count; i++) {            a[i] = sca.nextInt();        }        //调用排序算法        HeapSort(a);        // 打印排序后的数组        for (int j = 0; j < a.length; j++) {            System.out.print(a[j] + " ");        }    }}
0 0
原创粉丝点击