• Problem C: 算法10-10,10-11:堆排序


    Problem Description

    堆排序是一种利用堆结构进行排序的方法,它只需要一个记录大小的辅助空间,每个待排序的记录仅需要占用一个存储空间。

    首先建立小根堆或大根堆,然后通过利用堆的性质即堆顶的元素是最小或最大值,从而依次得出每一个元素的位置。

    堆排序的算法可以描述如下:

     

     在本题中,读入一串整数,将其使用以上描述的堆排序的方法从小到大排序,并输出。

     Input Description

     

    输入的第一行包含1个正整数n,表示共有n个整数需要参与排序。其中n不超过100000。

    第二行包含n个用空格隔开的正整数,表示n个需要排序的整数。

     

     Output Description

     

    只有1行,包含n个整数,表示从小到大排序完毕的所有整数。

    请在每个整数后输出一个空格,并请注意行尾输出换行。

    Sample Input

    1. 10
    2. 2 8 4 6 1 10 7 3 5 9

     Sample Output

    1 2 3 4 5 6 7 8 9 10 

     Hint

    在本题中,需要按照题目描述中的算法完成堆排序的算法。

    堆排序对于元素数较多的情况是非常有效的。通过对算法的分析,不难发现在建立含有n个元素的堆时,总共进行的关键字比较次数不会超过4n,且n个节点的堆深度是log2n数量级的。因此,堆排序在最坏情况下的时间复杂度是O(nlog2n),相对于快速排序,堆排序具有同样的时间复杂度级别,但是其不会退化。堆排序较快速排序的劣势是其常数相对较大。

     我的想法:

     我的代码:

    1. #include
    2. using namespace std;
    3. typedef struct HeapLine
    4. {
    5. int *str;
    6. int length;
    7. }HeapLine;
    8. void CreateLine(HeapLine &H, int n)
    9. {
    10. H.str = new int[n + 1];
    11. H.length = n;
    12. for (int i = 1; i <= H.length; i++)
    13. {
    14. cin >> H.str[i];
    15. }
    16. }
    17. void DeleteLine(HeapLine &H)
    18. {
    19. delete []H.str;
    20. H.length = 0;
    21. }
    22. void HeapAdjust(HeapLine &H, int s, int m)
    23. {
    24. int j;
    25. int rc;
    26. rc = H.str[s];
    27. for (j = 2 * s; j <= m; j *= 2)
    28. {
    29. if (j < m && H.str[j] < H.str[j + 1])
    30. ++j;
    31. if (rc > H.str[j])
    32. break;
    33. H.str[s] = H.str[j];
    34. s = j;
    35. }
    36. H.str[s] = rc;//插入
    37. }
    38. void HeapSort(HeapLine &H)
    39. {
    40. int i;
    41. int temp;
    42. for (i = H.length / 2; i > 0; --i)
    43. {
    44. HeapAdjust(H, i, H.length);
    45. }
    46. for (i = H.length; i > 1; --i)
    47. {
    48. temp = H.str[i];
    49. H.str[i] = H.str[1];
    50. H.str[1] = temp;
    51. HeapAdjust(H, 1, i - 1);
    52. }
    53. }
    54. void Print(HeapLine &H)
    55. {
    56. for (int i = 1; i <= H.length; i++)
    57. {
    58. printf("%d ", H.str[i]);
    59. /*if (i == 1)
    60. {
    61. printf("%d", H.str[i]);
    62. }
    63. else
    64. {
    65. printf(" %d", H.str[i]);
    66. }*/
    67. }
    68. printf("\n");
    69. }
    70. int main()
    71. {
    72. int n;
    73. HeapLine H;
    74. while (scanf("%d", &n) != EOF)
    75. {
    76. CreateLine(H, n);
    77. HeapSort(H);
    78. Print(H);
    79. DeleteLine(H);
    80. }
    81. return 0;
    82. }

  • 相关阅读:
    【linux命令讲解大全】105.掌握磁盘配额管理的edquota命令
    拍摄花絮丨《巴渝小将》走进四川·五华山旅游区拍摄圆满成功!
    基于YOLOv5的目标检测系统详解(附MATLAB GUI版代码)
    好心情精神心理科医生:轻度抑郁症需要治疗吗?
    计算机网络从三层交换机到路由器ospf
    借口总比办法多
    C语言ASCII码排序(1086: ASCII码排序(多实例测试))
    网络工程师知识点7
    mos管实现主副电源自动切换电路,并且“零”压降,静态电流20uA
    4. 串的【朴素模式匹配算法】、【KPM算法:求next数组、nextval数组】
  • 原文地址:https://blog.csdn.net/QQ3503814312/article/details/128164900