1. public void HeapSort(int[] data) {
    2. //创建大顶堆
    3. for (int i = 0; i < data.Length; ++i)
    4. {
    5. Add(data, i);
    6. }
    7. //开始排序
    8. for (int i = data.Length - 1; i >= 0; --i)
    9. {
    10. int mark = data[i];
    11. data[i] = data[0];
    12. data[0] = mark;
    13. CheckHeap(data,0,i-1);
    14. }
    15. Console.WriteLine(data);
    16. }
    17. public void Add(int[] heap,int idx) {
    18. int father = (idx - 1) / 2;
    19. if (father >= 0 && heap[idx] > heap[father]) {
    20. //如果父节点比本节点小,则交换
    21. int mark = heap[idx];
    22. heap[idx] = heap[father];
    23. heap[father] = mark;
    24. //交换之后继向上迭代
    25. Add(heap,father);
    26. }
    27. }
    28. public void CheckHeap(int[] heap,int idx,int len) {
    29. //限制边界,当把堆顶的元素放到最后时,堆的大小就变为了原堆大小 - 1
    30. int left = (2 * idx + 1 > len) ?idx: (2 * idx + 1);
    31. int right = (2 * idx + 2 > len) ? idx : (2 * idx + 2);
    32. bool _change = heap[idx] < Math.Max(heap[left],heap[right]);
    33. if (_change) {
    34. if (Math.Max(heap[left], heap[right]) == heap[left])
    35. {
    36. //找出子节点中最大的一个,并交换
    37. int mark = heap[idx];
    38. heap[idx] = heap[left];
    39. heap[left] = mark;
    40. //交换后继续向下迭代,直到限制的边界,也就是此时堆的大小
    41. CheckHeap(heap, left, len);
    42. }
    43. else {
    44. int mark = heap[idx];
    45. heap[idx] = heap[right];
    46. heap[right] = mark;
    47. CheckHeap(heap, right, len);
    48. }
    49. }
    50. }