【选择排序】堆排序--Java

来源:互联网 发布:淘宝集运香港仓电话 编辑:程序博客网 时间:2024/05/17 20:54

堆排序是一种树形选择排序方法。其特点是:

在排序过程中,将R[1.2.3......n]看成是一棵完全二叉树的顺序储存结构,利用完全二叉树中双亲节点和孩子节点之间的内在关系,在当前无序区中选择关键字最大(或最小)的记录。

且当父节点的键值总是大于或等于任何一个子节点的键值为最大堆;当父节点的键值总是小于或等于任何一个子节点的键值为最小值。下图是一个最小堆:








例如:设待排序的表有10个记录,其关键字分别为{6,8,7,9,0,1,3,2,4,5}。其堆排序的过程为:

初始堆的建立:










(a~f)步骤:















(g~r)步骤,排序完成:















代码如下(运行成功):

public class HeapSort {public static void main(String[] args){int[] array={3,4,6,7,9,8,1,5,2,0};print(array);Sort(array);System.out.println("排序后的数组:");print(array);}public static void swap(int[] array,int i,int j){if(i!=j){int tmp=array[j];array[j]=array[i];array[i]=tmp;}}public static void Sort(int[] array){for(int i=0;i<array.length;i++){creatMaxHeap(array, array.length-1-i);swap(array, 0, array.length-1-i);print(array);}}public static void creatMaxHeap(int[] array,int lastIndex){for(int i=(lastIndex-1)/2;i>=0;i--){int k=i;while(2*k+1<=lastIndex){int big=2*k+1;if(big<lastIndex){if(array[big]<array[big+1]){big++;}}if(array[k]<array[big]){swap(array, k, big);k=big;}else{break;}}}}public static void print(int[] array){for(int i=0;i<array.length;i++){System.out.print(array[i]+"\t");}System.out.println();}}

堆排序的最坏时间复杂度为O(n*logn)。堆排序的平均性能分析较难,但实际研究表明,它接近于最坏性能。其辅助空间复杂度为O(1)。且是一种不稳定的排序方法。

0 0
原创粉丝点击