• 堆排序
    • 基本思想
    • 步骤
    • By C++
    • By Golang

    堆排序

    基本思想

    步骤

    By C++

    1. #include <stdio.h>
    2. #define MaxSize 100
    3. typedef int KeyType; /*关键字类型*/
    4. typedef char ElemType[10]; /*其他数据项类型*/
    5. typedef struct
    6. {
    7. KeyType key; /*关键字域*/
    8. ElemType data; /*其他数据域*/
    9. } LineList; /*线性表元素类型*/
    10. void Sift(LineList R[],int low,int high)
    11. {
    12. int i=low,j=2*i; /*R[j]是R[i]的左孩子*/
    13. LineList tmp=R[i];
    14. while (j<=high)
    15. { if (j<high && R[j].key<R[j+1].key) /*若右孩子较大,把j指向右孩子*/
    16. j++; /*j变为2i+1,指向右孩子结点*/
    17. if (tmp.key<R[j].key)
    18. { R[i]=R[j]; /*将R[j]调整到双亲结点位置上*/
    19. i=j; /*修改i和j值,以便继续向下筛选*/
    20. j=2*i;
    21. }
    22. else break; /*筛选结束*/
    23. }
    24. R[i]=tmp; /*被筛选结点的值放入最终位置*/
    25. }
    26. void HeapSort(LineList R[],int n)
    27. {
    28. int i;
    29. LineList tmp;
    30. for (i=n/2;i>=1;i--) /*循环建立初始堆*/
    31. Sift(R,i,n);
    32. for (i=n;i>=2;i--) /*进行n-1次循环,完成堆排序*/
    33. { tmp=R[1]; /*将第一个元素同当前区间内R[1]对换*/
    34. R[1]=R[i];
    35. R[i]=tmp;
    36. Sift(R,1,i-1); /*筛选R[1]结点,得到i-1个结点的堆*/
    37. }
    38. }
    39. void main()
    40. {
    41. LineList R[MaxSize];
    42. KeyType a[]={0,75,87,68,92,88,61,77,96,80,72}; /*有效数据从a[1]开始*/
    43. int n=10,i;
    44. for (i=0;i<=n;i++)
    45. R[i].key=a[i];
    46. printf("排序前:");
    47. for (i=1;i<=n;i++)
    48. printf("%3d",R[i].key);
    49. printf("\n");
    50. HeapSort(R,n);
    51. printf("排序后:");
    52. for (i=1;i<=n;i++)
    53. printf("%3d",R[i].key);
    54. printf("\n");
    55. }

    By Golang

    go