堆排序

基本思想

步骤

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