堆排序之Java实现

来源:互联网 发布:忆江南的知作者怎么写 编辑:程序博客网 时间:2024/06/16 13:38

堆排序思想

  • 堆是一种重要的数组结构,为一棵完全二叉树。
  • 堆排序就是利用“堆”这种数据结构对数组排序。

代码参考

工具类:

public class Util {    public static void printArray(int[] array){        System.out.print("{");        for(int i = 0;i<array.length;i++){            System.out.print(array[i]);            if(i<array.length - 1){                System.out.print(", ");            }        }        System.out.println("}");    }    public static void exchangeElements(int[] array,int index1,int index2){        int temp = array[index1];        array[index1] = array[index2];        array[index2] = temp;    }}

具体实现类:

/* * 1.构建最大堆 * 2.选择项,并与第0位置元素交换 * 3.由于步骤2的交换可能破坏了最大堆的性质,第0不再是最大元素,需要调用maxHeap调整堆(沉降法),如果需要重复步骤2 * */public class HeapSort {    public static void main(String[] args) {        int[] array = {50,10,90,30,70,40,80,60,20};        System.out.println("Before Heap:");        Util.printArray(array);        headSort(array);        System.out.println("After Heap:");        Util.printArray(array);    }    public static void headSort(int[] array){        if(array == null || array.length <=1){            return;        }        buildMaxHeap(array);//构造最大堆        Util.printArray(array);        for(int i = array.length-1;i>=1;i--){            Util.exchangeElements(array, 0, i);            maxHeap(array, i, 0);        }    }    private static void buildMaxHeap(int[] array){        if(array == null || array.length<=1){            return;        }        int half = array.length/2;        for(int i = half;i >= 0;i--){            maxHeap(array, array.length, i);        }    }    private static void maxHeap(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 = right;        }        if(index != largest){            Util.exchangeElements(array, index, largest);            maxHeap(array, heapSize, largest);        }    }}

如有疑问可以参考《大话数据结构》

0 0
原创粉丝点击