1. 程式人生 > >堆排序演算法(java版)

堆排序演算法(java版)

package com.duobang.headSort;

import java.util.Arrays;
import java.util.Random;

public class MyHeapSort {
    public static void main(String[] args) {
        //隨機產生count個元素的陣列
        Random rd = new Random();
        int count = 10;
        int[] a = new int[count];
        for (int i = 0; i < count; i++) {
            a[i] = rd.nextInt(count);
        }

        System.out
.println("初始陣列:" + Arrays.toString(a)); heapSort(a); System.out.println("排序後陣列:" + Arrays.toString(a)); } //堆排序 private static void heapSort(int[] a) { //建立大根堆 buildMaxHeap(a); //排序:將大根堆中最大的元素放在最後,再次調節大根堆. for (int i = a.length - 1; i > 0 ; i--) { //交換頭尾元素
swap(a,0,i); //調整大根堆 adjustDownToUp(a,0,i); } //調整會出現第一個元素比第二個元素大的問題,所以交換 if (a[0] > a[1]) { swap(a,0,1); } } //將root為根節點的元素調整為大根堆 private static void adjustDownToUp(int[] a, int root, int last) { int tmp = a[root]; //調整大根堆
for (int i = root * 2 + 1; i < last - 1; i = i * 2 + 1) { //取root的左右孩子中最大的一個 if (i < last && a[i] < a[i+1]) { i++; } //最大的孩子與根節點比較 if (tmp > a[i]) { break; }else{ a[root] = a[i];//將大的孩子放在根節點的位子 root = i;//根節點變為當前大的孩子的位置 } } //將根節點放在root的位置 a[root] = tmp; } //交換下標為i和i2兩個元素的位置 private static void swap(int[] a, int i, int i2) { a[i] = a[i] ^ a[i2]; a[i2] = a[i] ^ a[i2]; a[i] = a[i] ^ a[i2]; } //建立大根堆 private static void buildMaxHeap(int[] a) { int len = a.length; //從最後一個節點開始調整大根堆 for (int i = (len - 1 - 1)/2; i >= 0; i--) { //將父節點是i的這棵樹調節成一棵大根堆 adjustDownToUp(a,i,len); } } }