Java 排序之 堆排序

来源:互联网 发布:关于mac版千牛问题. 编辑:程序博客网 时间:2024/06/03 20:16

堆排序:具有原址性 且 复杂度为O(nlgn)

集中了插入排序和归并排序的优点。

堆 是一个数组,可以看成一个近似的完全二叉树,除了最底层外,该树是完全充满的。而且从左到右从满。

给定一个节点的下标为i,

父节点: i/2

左节点下标

Left(i) = 2 * i;

右节点下标

Right(i) = 2*i +1;

如果下标冲0 开始而不是1开始的话 

int left = index * 2+1;

int right = index * 2 + 2;


最大堆:

堆中最大的元素放在跟节点中,该子树包含的所有节点的值都不得大于该子树的根节点的值。

    public void heapSort(int[] array){        buildMaxHeap(array);        int heapSize = array.length;        for(int i = array.length-1;i>0;i--){            swap(array,0,i);            heapSize--;            maxHeapify(array,heapSize,0);        }    }    public void maxHeapify(int[] array, int heapSize,int index){        int left = index * 2+1;        int right = index * 2 + 2;        int largest = index;        if(left < heapSize && array[left] > array[index])            largest = left;        if(right < heapSize && array[right] > array[largest])// largest 而不是 index            largest = right;        if(largest != index){            swap(array,index,largest);            maxHeapify(array, heapSize, largest);        }    }    public void buildMaxHeap(int[] array){        int heapSize = array.length;        for(int i = heapSize/2; i >= 0;i--){            maxHeapify(array,heapSize,i);        }    }


0 0
原创粉丝点击