[关闭]
@Ggmatch 2018-02-22T21:13:27.000000Z 字数 1070 阅读 1122

堆排序

堆排序 算法 C/C++


算法思想

假设有一个数组data[N],从0开始,基本操作为调整堆(adjustHeap),那么堆排序(升序-最大堆)的过程如下:
1.建堆(buildHeap):从data[N/2-1]开始,到data[0]结束,每次都是一次adjustHeap的操作。
2.把堆顶元素调到最后,再来进行adjustHeap,由后往前,一直到整个data遍历完。堆排序过程完毕。

算法实现

  1. void adjustHeap(int *data, int node, int length) //调整堆
  2. {
  3. int lchild = 2 * node + 1; //i的左孩子节点序号
  4. int rchild = 2 * node + 2; //i的右孩子节点序号
  5. int parent = node;
  6. while (lchild <= length-1) //左孩子在堆里
  7. {
  8. if (rchild <= length-1) //若右孩子也在堆里
  9. {
  10. if (data[rchild] > data[lchild]) //左孩子比右孩子小
  11. {
  12. // 右孩子与父亲节点比较
  13. if (data[parent] < data[rchild])
  14. {
  15. Swap(&data[parent], &data[rchild]);
  16. parent = rchild;
  17. lchild = parent * 2 + 1;
  18. rchild = parent * 2 + 2;
  19. continue;
  20. }
  21. else
  22. break;
  23. }
  24. }
  25. if (data[lchild] > data[parent]) //左孩子大于父亲节点
  26. {
  27. Swap(&data[lchild], &data[parent]);
  28. parent = lchild;
  29. lchild = parent * 2 + 1;
  30. rchild = parent * 2 + 2;
  31. }
  32. else
  33. break;
  34. }
  35. }
  1. void buildHeap(int *data, int length) //建堆
  2. {
  3. for (int i = length / 2 - 1;i >= 0;i--) //非叶节点最大序号值为length/2 - 1
  4. {
  5. adjustHeap(data, i, length);
  6. }
  7. }
  1. void HeapSort(int *data, int length) //堆排序
  2. {
  3. // 0.异常情况
  4. if (data == NULL || length <= 0)
  5. return;
  6. int i;
  7. // 建堆
  8. buildHeap(data, length);
  9. // 调整堆顶元素,并进行堆调整
  10. for (i = length-1;i >= 1;i--)
  11. {
  12. Swap(&data[0], &data[i]); //交换堆顶和最后一个元素,即每次将剩余元素中的最大者放到最后面
  13. adjustHeap(data, 0, i); //重新调整堆顶节点成为大顶堆
  14. }
  15. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注