堆排序

  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 }
原文地址:https://www.cnblogs.com/lihuazhu/p/10753519.html