堆排序详解以及JAVA实现

来源:互联网 发布:网络英语课 编辑:程序博客网 时间:2024/04/27 13:59

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。

什么是堆

堆是一棵完全二叉树,它的特点是(以大顶堆为例),堆顶的元素大于子节点的元素。

如果用数组array来存储,则堆顶是array[0],其子节点是array[1],array[2]。array[1]的子节点是array[3],array[4]。一般的,array[i]的子节点是array[2*i+1]和array[2*i+2],array[i]的父节点是array[(i-1)/2]。

堆排序的过程

首先将数组排成一个堆(O(nlogn)时间),根据堆的性质,第一个元素是最大的元素,将其与数组末尾的元素交换。

此时,数组的堆结构已经被破坏(此时堆的第一个元素不是最大),我们将堆的第一个元素不断“下沉”,使得数组的前n-1个元素重新构成堆(O(logn)时间)。新的堆结构产生之后,此时堆顶是堆中最大元素,即数组前n-1个元素中最大的,将它与数组倒数第二个元素交换。此时,数组的最后两位分别是第二大和第一大的元素了。

此时,数组的堆结构再次被破坏,类似的,将前n-2个元素重新构成堆,....

复杂度分析

建立堆的过程:插入法,每次向大顶堆尾部插入一个元素,“上浮”最多logn次,插入n个元素,共需O(nlogn)时间

维护堆的过程:每次堆被破坏,堆顶元素“下沉”次数最多logn次,堆被破坏n次,共需O(nlogn)时间。

故,复杂度为O(nlogn)。

JAVA代码

public class HeapSort {public static void heap_sort(int [] array){for (int i = 2; i < array.length + 1; i ++){insert_last_into_big_heap(array, i);}for (int i = 0; i < array.length; i ++){swap(array, 0, array.length - 1 - i);fix_big_heap(array, array.length - i);}}public static void insert_last_into_big_heap(int [] array, int len){//假设array[0]~array[last_index-2]是一个大顶堆,要将array[last_index-1]加入大顶堆int child_index = len - 1;int father_index = (child_index - 1) / 2;while (father_index >= 0){if (array[father_index] < array[child_index]){swap(array, father_index, child_index);child_index = father_index;father_index = (child_index - 1) / 2;}else{break;}}}public static void fix_big_heap(int [] array, int len){//若array[0]最大,则array是一个大顶堆;现在要将array[0]下沉,使得array成为大顶堆int father_index = 0;int child_index_left = father_index * 2 + 1;int child_index_right = father_index * 2 + 2;while (child_index_right < len - 1){int max_child_index = array[child_index_left] > array[child_index_right] ? child_index_left : child_index_right;if (array[father_index] < array[max_child_index]){swap(array, father_index, max_child_index);father_index = max_child_index;child_index_left = father_index * 2 + 1;child_index_right = father_index * 2 + 2;}else {break;}}}public static void swap(int [] array, int i, int j){if (i != j){array[i] = array[i] + array[j];array[j] = array[i] - array[j];array[i] = array[i] - array[j];}}public static void print_array(int [] array){for (int i = 0; i < array.length; i ++){System.out.print(array[i] + " ");}System.out.println();}public static void main(String [] args){int [] array = {1,4,5,8,3,6,9,7,2,0};heap_sort(array);print_array(array);}}
3 0
原创粉丝点击