堆排序之Java实现
代码:
1 package cn.com.zfc.lesson21.sort; 2 3 /** 4 * 5 * @title HeapSort 6 * @describe 堆排序 7 * @author 张富昌 8 * @date 2016年10月2日下午5:33:50 9 */ 10 public class HeapSort { 11 public static void main(String[] args) { 12 // 声明整型数组 13 int[] array = new int[10]; 14 // 使用循环和随机数初始化数组 15 for (int i = 0; i < array.length; i++) { 16 array[i] = (int) Math.round(Math.random() * 100); 17 } 18 System.out.println("原始数组为:"); 19 for (int i : array) { 20 System.out.print(i + " "); 21 } 22 System.out.println(); 23 System.out.println("排序后的数组为:"); 24 for (int i : heapSort(array)) { 25 System.out.print(i + " "); 26 } 27 } 28 29 /** 30 * 31 * 功能:堆排序的基本思想是 32 * 33 * 参数:int[] array 34 * 35 * 返回类型:int[] 36 */ 37 public static int[] heapSort(int[] array) { 38 int[] arr = array; 39 for (int i = (arr.length - 2) / 2; i >= 0; i--) { 40 // 将 0~[n-1]调整成大顶堆 41 heapAdjust(arr, i, arr.length - 1); 42 } 43 for (int i = arr.length - 1; i > 0; i--) { 44 // 第 i 趟排序 45 swap(arr, 0, i); 46 heapAdjust(arr, 0, i - 1); 47 } 48 49 return arr; 50 } 51 52 /** 53 * 54 * 功能:将待排数组调节成大顶堆,调整 arr[low],使除它以外的元素成为大顶堆 55 * 56 * 参数:int[] arr, int low, int high 57 * 58 * 返回类型:void 59 */ 60 public static void heapAdjust(int[] arr, int low, int high) { 61 for (int f = low, i = 2 * low + 1; i <= high; i = 2 * i + 1) { 62 // f 为被调整的结点,i 为 f 的最大孩子 63 if (i < high && arr[i] < arr[i + 1]) { 64 // 右孩子更大,则 i 指向右孩子 65 i++; 66 } 67 if (arr[f] >= arr[i]) { 68 // 已经成为大顶堆了 69 break; 70 } 71 // 交换调整结点的位置 72 swap(arr, f, i); 73 // 让 i 成为新的调整结点 74 f = i; 75 } 76 } 77 78 /** 79 * 80 * 功能:交换两个数的值 81 * 82 * 参数:int i, int j 83 * 84 * 返回类型:void 85 */ 86 public static void swap(int[] arr, int i, int j) { 87 int temp = arr[i]; 88 arr[i] = arr[j]; 89 arr[j] = temp; 90 91 } 92 }
运行结果: