1. 程式人生 > 遊戲攻略 >《原神攻略》2.6版巖中幽谷聖遺物祕境開啟教程 巖中幽谷祕境怎開啟

《原神攻略》2.6版巖中幽谷聖遺物祕境開啟教程 巖中幽谷祕境怎開啟

1.堆排序的基本思想:

*用堆排序實現升序
* 其主要用到了大根堆的思想(先理解大根堆的思想,再進行堆排序)
*
* 因為大根堆可以快速找到最大數,所以只要每次都把這個最大數和最後一個數交換,那麼依次進行:
* 就可以使得最大數被換到最後一個,倒二大的數換到倒二個,直到heapSize縮到0為止,則全部換完,完成排序

 

2.實現程式碼及解析:

 1 public static void HeapSort(int[] arr) 
 2     {
 3         if (arr == null || arr.length == 1) {
 4             return
; 5 } 6 for (int i = 0; i < arr.length; i++) { 7 HeapInsert(arr,i);//先將其調整為大根堆的形式 8 } 9 int heapSize = arr.length; 10 //接下來開始逐步取出這些元素 11 swap(arr,0,--heapSize);//因為arr[0]肯定是最大數,將其換到最後一個(注意是前--) 12 while (heapSize > 0) { 13 Heapify(arr,0,heapSize);//
因為把某個小數換到第一個了,要進行大根堆的向下調整 14 swap(arr,0,--heapSize);//把最大數換到當前子陣列的最後一個 15 } 16 } 17 18 public static void HeapInsert(int[] arr,int index) 19 { 20 while (arr[index] > arr[(index - 1) / 2]) { 21 swap(arr,index,(index - 1) / 2); 22 index = (index - 1) / 2;
23 } 24 } 25 26 public static void Heapify(int[] arr,int index,int heapSize) 27 { 28 int left = 2 * index + 1; 29 while (left < heapSize) { 30 int largest = left; 31 if (left + 1 < heapSize && arr[left] < arr[left + 1]) { 32 largest = left + 1; 33 } 34 if (arr[largest] <= arr[index]) 35 { 36 largest = index; 37 } 38 if (largest == index) { 39 break; 40 } 41 swap(arr,largest,index); 42 index = largest; 43 left = 2 * index + 1; 44 } 45 } 46 47 public static void swap(int[] arr,int a,int b) 48 { 49 if (a != b) { 50 arr[a] = arr[a] ^ arr[b]; 51 arr[b] = arr[a] ^ arr[b]; 52 arr[a] = arr[a] ^ arr[b]; 53 } 54 }