1 package my_basic; 2 3 import java.util.Arrays; 4 5 public class HeapSort { 6 7 public static void heapSort(int[] arr) { 8 if (arr == null || arr.length <2) { 9 return; 10 } 11 //建堆 12 for (int i = 0; i < arr.length; i++) { 13 heapInsert(arr,i); 14 } 15 int size = arr.length; 16 swap(arr, 0, --size); 17 18 /*调整堆*/ 19 while ( size > 0 ) { 20 heapify(arr, 0, size); 21 swap(arr, 0, --size); 22 } 23 } 24 25 public static void heapInsert(int[] arr, int index) { 26 while (arr[index] > arr[(index-1)/2]) { 27 swap(arr,index,(index-1)/2); 28 index = (index-1)/2; 29 } 30 } 31 32 public static void swap(int[] arr, int i, int j) { 33 int tmp = arr[i]; 34 arr[i] = arr[j]; 35 arr[j] = tmp; 36 37 } 38 /** 39 * 调整堆 40 * @param arr 41 * @param index 要开始调整的位置 42 * @param heapSize 标记越界 43 */ 44 public static void heapify(int[] arr, int index, int heapSize) { 45 int left = index * 2 + 1; 46 while (left < heapSize) { 47 int large = ((left+1) < heapSize && arr[left+1]>arr[left]) 48 ? left+1 49 : left; 50 large = arr[large] > arr[index] ? large : index; 51 if (large == index) { 52 break; 53 } 54 swap(arr, large, index); 55 index = large; 56 left = index * 2 + 1; 57 } 58 } 59 60 public static int[] generateRandomArray(int maxSize, int maxValue) { 61 int[] arr = new int[(int) ((maxSize+1) * Math.random())]; 62 for (int i = 0; i < arr.length; i++) { 63 arr[i] = (int) ((maxValue+1) * Math.random() - (maxValue) * Math.random()); 64 } 65 return arr; 66 } 67 public static int[] copyArray(int[] arr1) { 68 int[] arr2 = new int[arr1.length]; 69 for (int i = 0; i < arr1.length; i++) { 70 arr2[i] = arr1[i]; 71 } 72 return arr2; 73 74 } 75 public static void comparator(int[] arr2) { 76 Arrays.sort(arr2); 77 78 } 79 public static boolean isEqual(int[] arr1, int[] arr2) { 80 if ((arr1==null && arr2!=null) || ((arr1!=null && arr2==null))) { 81 return false; 82 } 83 if (arr1.length != arr2.length) { 84 return false; 85 } 86 for (int i = 0; i < arr2.length; i++) { 87 if (arr1[i] != arr2[i]) { 88 return false; 89 } 90 } 91 return true; 92 } 93 94 public static void main(String[] args) { 95 int testTime = 500000; 96 int maxSize = 100; 97 int maxValue = 100; 98 boolean succeed = true; 99 for (int i = 0; i < testTime; i++) { 100 int[] arr1 = generateRandomArray(maxSize, maxValue); 101 int[] arr2 = copyArray(arr1); 102 heapSort(arr1); 103 comparator(arr2); 104 if (!isEqual(arr1, arr2)) { 105 succeed = false; 106 break; 107 } 108 } 109 System.out.println(succeed ? "Nice!" : "Fucking fucked!"); 110 111 } 112 113 }