堆排序
一 堆排序
堆排序算法的核心是堆,堆也称为优先队列。
堆的性质:堆是一个完全二叉树,所有的父元素都大于其两个子元素,对子元素之间的大小没有要求。
堆排序中堆的操作主要是从上向下调整操作
1.1 从上向下调整操作heapAdjust
给定一个元素,若该元素比它的一个较小的子元素要小,则交换两个的数据;并一直向下比较,直到叶子元素或父元素大于两个子元素。
注:索引从0开始时,i的子元素为2i+1和2i+2;i的父元素为(i+1)/2。
1.2 堆排序
① 从最后一个父元素向前进行调整操作,直到根元素,此时已构成堆。
② 堆调整完成后,将根元素与最后一个元素交换,将数据长度减一,再调整堆;直到数据长度为1。
注:若数据长度为len,那么lastParentIdx=len/2-1
1 void heapAdjust(int *myArray, int parentIdx, int len) 2 { 3 int childIdx = 2 * parentIdx + 1; 4 while (childIdx < len) 5 { 6 if (childIdx+1 < len && myArray[childIdx] < myArray[childIdx+1]) 7 ++childIdx; 8 if (myArray[parentIdx] < myArray[childIdx]) 9 { 10 swap(myArray[parentIdx], myArray[childIdx]); 11 parentIdx = childIdx; 12 childIdx = 2 * parentIdx + 1; 13 } 14 else 15 break; 16 } 17 } 18 19 void heapSort(int *myArray, int len) 20 { 21 int lastParentIdx = len/2 - 1; 22 for (int idx=lastParentIdx;idx>=0;idx--) 23 heapAdjust(myArray, idx, len); 24 while (len > 1) 25 { 26 swap(myArray[0], myArray[len-1]); 27 heapAdjust(myArray, 0, --len); 28 } 29 }