堆排序

来源:互联网 发布:粗花呢西装 知乎 编辑:程序博客网 时间:2024/06/05 14:00

堆积(heap)是树结构的第三种型态堆积是一棵二元树
参考:《算法导论(第3版)》第6章
八大排序算法
代码:

package algorithm;import java.util.Arrays;/** * Created by 刘一波 LiuYibo on 15/11/11. * E-Mail:zhanlanstar@163.com */public class HeapSortMain {    public static void main(String[] args) {        int[] a = {12, 3, 5, 4, 2, 1, 33, 4, 89, 22, 120, 23, 14};        HeapSort heapSort = new HeapSort();        heapSort.sort(a);        System.out.println(Arrays.toString(a));    }    /**     * 堆排序     * <p/>     * 此排序过程:     * 1. 建大根堆     * 2. 把第一个数字和最后一个交换。且已排序好的个数加1。即,大根堆建好后,第一个是最大的,把它放到最后即可。     * 3. 对于除最后排序好的个数外的数组进行建堆(重复1),交换(重复2),直到结束。     * <p/>     * 这不是完全按照原始算法写的代码,所以可能效率不很高。     */    static class HeapSort {        /**         * 建堆,建大根堆。         * 一个过程:         * 1. 每一次开始时,i=n/2,i的两个子节点分别是 2*i 和 2*i+1。         * 2. 如果两个子结点的序号在数组内,分别对其进行比较,把最大的放在父结点位置。         * 3. i-- 直到退出。         * 4. 重复1,2,3 直到没有交换,则完成。         *         * @param a      待排序数组         * @param sorted 已经排序好的个数         */        public void heap(int[] a, int sorted) {            while (true) {                int flag = 0;//交换次数,未交换表明此数组已经符合大根堆条件                for (int i = (a.length - sorted) / 2; i >= 0; i--) {                    int x = i * 2;                    int y = i * 2 + 1;                    System.out.println(i + " " + x + " " + y);                    if (y <= (a.length - sorted - 1)) {                        if (a[i] < a[y]) {                            swap(a, i, y);                            flag++;                        }                    }                    if (x <= (a.length - sorted - 1)) {                        if (a[i] < a[x]) {                            swap(a, i, x);                            flag++;                        }                    }                }                if (flag == 0) {                    break;                }            }        }        /**         * 排序         * <p/>         * 1. 大根堆的第一个是最大的,移动到最后,把最后一个放在第一个位置(交换)。         * 2. 把剩余的数调整为大根堆。         * 3. 重复1,2,直到数组排序完成。         *         * @param a         */        public void sort(int[] a) {            heap(a, 0);            for (int i = 0; i < a.length; i++) {                swap(a, 0, a.length - 1 - i);                heap(a, i + 1);            }        }        public void swap(int[] numbers, int one, int tow) {            int temp = numbers[one];            numbers[one] = numbers[tow];            numbers[tow] = temp;            System.out.println(Arrays.toString(numbers));        }    }}
0 0