堆排序的循环实现

package study.datastructure.sort;

import java.util.Random;

/**
 * @description: 堆排序
 * 时间复杂度O(n*log2n)
 * 空间复杂度O(1)
 * 不稳定 例子:  3(0)  大根堆排序后 3(1), 3(0), 4
 *             3(1) 4
 **/

public class HeapSort {

    private void heapSort(int[] array, int length) {
        //从 length/2 -1 的下标处开始建立堆,因为这个节点是最后一个有孩子的节点,它之前的节点都有孩子,之后的节点都没有孩子
        for(int i = length/2 -1; i >= 0; i--) {
            heapAdjust(array, i, length);
        }
        //交换堆顶节点与最后一个节点的位置,以数组长度减小1的数组重新建立堆,数组后面的数据,已经排好顺序
        for(int i = length-1; i >= 0; i--) {
            int temp = array[0];
            array[0] = array[i];
            array[i] = temp;
            heapAdjust(array, 0, i-1);
        }
    }

    /** 循环实现大根堆的建立 */
    private void heapAdjust(int[] array, int parent, int length) {
        int tempParent = array[parent];
        int Lchild = parent*2 +1;
        //最大孩子的下标默认是左孩子
        int maxChild = Lchild;
        while(Lchild < length) {
            int Rchild = parent*2 +1 +1;
            if(Rchild < length) {
                maxChild = array[Lchild] > array[Rchild]? Lchild : Rchild;
            }
            //父节点大于所有孩子节点,直接退出循环
            if(tempParent > array[maxChild]) {
                break;
            }
            //大根堆调整
            array[parent] = array[maxChild];
            array[maxChild] = tempParent ;
            //以最大的孩子为父节点,继续循环
            parent = maxChild;
            Lchild = parent*2 +1;
            maxChild = Lchild;
        }
    }

    public static void main(String arg[]) {
        int length = 10;
        int[] array = new int[length];
        for(int i = 0; i < length; i++) {
            Random data = new Random();
            array[i] = data.nextInt(100);
        }
        new HeapSort().heapSort(array, length);
        for(int date : array) {
            System.out.println(date);
        }
    }
}

 

posted @ 2018-08-13 20:08  特仑苏灬  阅读(164)  评论(0编辑  收藏  举报