堆排序
思想:
-
首先将需要排序的数组放入树中,将树进行大顶堆或者小顶堆排序,当然只是采用树的结构思想
大顶堆(根节点比左右孩子都大) 小顶堆(根节点比左右孩子节点都小)
注:通常大顶堆用于从小到大的排序 小顶堆用于从大到小排序 -
然后将排好序的大顶堆的第一个节点和最后一个节点交换位置 把最后一个节点取出,即为最大数
-
然后将剩下的树再进行大顶堆排序,重复上述步骤,直到最后一个节点完成,堆排序完成。
public class HeapSort { public static void main(String[] args) { int[] array = new int[]{3,1,8,34,93,1,35,34,7,9,6,5}; System.out.println(Arrays.toString(array)); heapSort(array); System.out.println(Arrays.toString(array)); } public static void heapSort(int[] array){ //最后一个叶子节点的双亲节点 int index = (array.length - 1)/2; for(int i = index; i >= 0; i--){ //排序成大顶堆 maxHeap(array, array.length, i); } //将最后一个元素拿出 for (int i = array.length -1; i > 0; i--) { int temp = array[0]; array[0] = array[i]; array[i]= temp; //从上往下使树成为大顶堆结构 maxHeap(array,i,0); } } /** * 将树转化为大顶堆 * @param array 需要排序的数组 * @param size 排序的大小,每次完成大顶堆之后减1 * @param index 从最后一个叶子节点的双亲节点开始 */ public static void maxHeap(int[] array,int size,int index){ //左孩子 int leftNode = (index*2)+1; //右孩子 int rightNode = (index*2)+2; int max = index; //找出双亲节点和左右孩子节点中最大的 if(leftNode < size&&array[max]<array[leftNode]){ max = leftNode; } if(rightNode < size&&array[max]<array[rightNode]){ max = rightNode; } //当父节点不是最大的时候,交换位置使父节点变为最大 if(max != index){ int temp = array[index]; array[index] = array[max]; array[max] = temp; //当交换位置后,可能会破坏原来已经排好序的大顶堆平衡 maxHeap(array, size, max); } } }