堆排序
堆排序使用的是构造大顶堆,然后交换第0个元素和最后一个元素,依次类推完成排序
1 public class test { 2 3 public static void main(String[] args) { 4 int[] data5 = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 }; 5 print(data5); 6 heapSort(data5); 7 System.out.println("排序后的数组:"); 8 print(data5); 9 } 10 11 public static void createMaxdHeap(int[] data, int lastIndex) { 12 for (int i = (lastIndex-1)/2; i >= 0; i--) { 13 int k = i; 14 while (2*k+1 <= lastIndex) { 15 int biggerIndex = 2*k+1; 16 // 比较左子节点和右子节点,去最大值的索引 17 if (biggerIndex < lastIndex) { 18 if(data[biggerIndex] < data[biggerIndex+1]) { 19 biggerIndex++; 20 } 21 } 22 // 如果子节点比它大,则交换索引,并修改k 23 if (data[k] < data[biggerIndex]) { 24 swap(data, k, biggerIndex); 25 k = biggerIndex; 26 } else { // 否则跳出循环 27 break; 28 } 29 30 } 31 } 32 } 33 34 public static void heapSort(int[] data) { 35 for (int i = 0; i < data.length; i++) { 36 // 创建大顶堆 37 createMaxdHeap(data, data.length - 1 - i); 38 // 把最大的元素放在最后一位 39 swap(data, 0, data.length - 1 - i); 40 print(data); 41 } 42 } 43 44 public static void swap(int[] data, int i, int j) { 45 if (i == j) 46 return; 47 48 data[i] = data[i] ^ data[j]; 49 data[j] = data[i] ^ data[j]; 50 data[i] = data[i] ^ data[j]; 51 } 52 public static void print(int[] data) { 53 for (int i = 0; i < data.length; i++) { 54 System.out.print(data[i] + "\t"); 55 } 56 System.out.println(); 57 } 58 }
浙公网安备 33010602011771号