1. 程式人生 > >堆排序(最大堆)

堆排序(最大堆)

big eap sys 位置 heap str col port star

import java.util.Arrays;

public class HeapSort {

//數組arr下標為0的位置不使用,待排序數字放入下標為 1 ~ arr.length-1 的位置,並對這些位置上的元素排序

public static void sort(int arr[]) {

HeapSort hs = new HeapSort();

hs.buildMaxHeap(arr, 1, arr.length - 1);

System.out.println("buildMaxHeap result : " + Arrays.toString(arr));

hs.adjustHeap(arr, 1, arr.length - 1);

}

//建最大堆

public void buildMaxHeap(int[] arr, int start, int end) {

for (int i = end ; i >= start; i--) {

downWithCycle(arr, i, end);

}

}

//堆調整

public void adjustHeap(int[] arr, int start, int end) {

for (int i = end; i > start; i--) {

swap(arr, start, i);

System.out.println("swap result : " + Arrays.toString(arr));

downWithCycle(arr, start, i - 1);

}

}

//下濾

public void downWithCycle(int[] arr, int start, int end) {

if (start >= end) {

return;

}

int index = start;

int leftIndex = 2 * index;

int rightIndex = 2 * index + 1;

while (leftIndex <= end) {

int biggestIndex = index;

if(arr[leftIndex]>arr[biggestIndex]){

biggestIndex = leftIndex;

}

if ((rightIndex <= end) && (arr[rightIndex] > arr[biggestIndex])) {

biggestIndex = rightIndex;

}

if(biggestIndex != index){

swap(arr,index,biggestIndex);

index = biggestIndex;

leftIndex = 2 * index;

rightIndex = 2 * index + 1;

}else{

return ;

}

}

}

//交換下標為a和b的元素

private void swap(int[] arr, int a, int b) {

int temp = arr[a];

arr[a] = arr[b];

arr[b] = temp;

}

public static void main(String[] args) {

int[] arr = { 0, 11, 2, 31, 444, 52, 16, 71, 8, 93, 10 };

System.out.println("origin : " + Arrays.toString(arr));

HeapSort.sort(arr);

System.out.println("result : " + Arrays.toString(arr));

}

}

堆排序(最大堆)