堆排序

来源:互联网 发布:淘宝竹鸡打笼 编辑:程序博客网 时间:2024/06/01 09:00

堆排序从简单排序算法基础上改进得到,也是一趟一趟从无序区中选择最小的记录放到有序区中。
大根堆:每个结点都不小于其孩子结点
小更对:每个结点都不大于其孩子结点

堆排序算法思想:先将array[0..n-1]调整为堆,array[0]为最大记录,然后交换array[0]和array[n-1],将最大记录归位。然后再将array[0..n-2]调整为堆,继续交换array[0]和array[n-2]…反复进行,直到只有一个记录,他便是最小的记录。

堆排序总结为两步:初始建堆,记录归位

筛选算法:

public void sift(int[] array, int low, int high) {        int i = low, j = 2 * i + 1;        int temp = array[i];        while (j <= high) {            if (j < high && array[j] < array[j + 1])                j++;            if (temp < array[j]) {                array[i] = array[j];                i = j;                j = 2 * i;            } else                break;        }        array[i] = temp;    }

堆排序算法:

public void heapSort(int[] array) {        int n = array.length;        //反复调用筛选算法来完成出书建堆        for (int i = n / 2 - 1; i >= 0; i--)            sift(array, i, n - 1);        //记录归位,然后继续调整堆        for (int i = n - 1; i > 0; i--) {            int temp = array[i];            array[i] = array[0];            array[0] = temp;            sift(array, 0, i - 1);        }    }   //筛选算法    public void sift(int[] array, int low, int high) {        int i = low, j = 2 * i + 1;        int temp = array[i];        while (j <= high) {            if (j < high && array[j] < array[j + 1])                j++;            if (temp < array[j]) {                array[i] = array[j];                i = j;                j = 2 * i;            } else                break;        }        array[i] = temp;    }
原创粉丝点击