堆排序

一 堆排序

  堆排序算法的核心是堆,堆也称为优先队列。

  堆的性质:堆是一个完全二叉树,所有的父元素都大于其两个子元素,对子元素之间的大小没有要求。

  堆排序中堆的操作主要是从上向下调整操作

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 }

 

posted @ 2015-07-18 15:21  yoleimei  阅读(155)  评论(0编辑  收藏  举报