当前位置:   article > 正文

王道C语言督学营OJ课后习题(课时17)

王道C语言督学营OJ课后习题(课时17)

  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <stdio.h>
  5. typedef int ElemType;
  6. typedef struct {
  7. ElemType *elem;
  8. int TableLen;
  9. }SSTable;
  10. void Init_ST(SSTable &ST,int len)//申请空间,并进行随机数生成
  11. {
  12. ST.TableLen=len;
  13. ST.elem=(ElemType*) malloc(sizeof (ElemType)*ST.TableLen);
  14. srand(time(NULL));
  15. for (int i = 0; i < ST.TableLen; ++i) {
  16. ST.elem[i]=rand()%100;
  17. }
  18. }
  19. void Print_ST(SSTable ST)
  20. {
  21. for (int i = 0; i < ST.TableLen; ++i) {
  22. printf("%3d",ST.elem[i]);
  23. }
  24. printf("\n");
  25. }
  26. void swap(ElemType &a,ElemType &b)
  27. {
  28. ElemType temp;
  29. temp=a;
  30. a=b;
  31. b=temp;
  32. }
  33. void SelectSort(ElemType *A,int n)
  34. {
  35. int i,j,min;//min是用来记录每一趟最小元素的下标
  36. for(i=0;i<n-1;i++)
  37. {
  38. min=i;
  39. for(j=i+1;j<n;j++)
  40. {
  41. if(A[j]<A[min])
  42. min=j;
  43. }
  44. if(i!=min)
  45. {
  46. swap(A[i],A[min]);
  47. }
  48. }
  49. }
  50. void AdjustDown(ElemType A[],int k,int len)
  51. {
  52. int dad=k;
  53. int son=2*dad+1;//左孩子下标
  54. while (son<=len)
  55. {
  56. if(son+1<=len && A[son]<A[son+1])//看下有没有右孩子,比较左右孩子选大的
  57. {
  58. son++;
  59. }
  60. if(A[son]>A[dad])//比较孩子和父亲,如果孩子大于父亲,那么进行交换
  61. {
  62. swap(A[son],A[dad]);
  63. dad=son;//孩子重新作为父亲,判断下一颗子树是否符合大根堆
  64. son=2*dad+1;
  65. } else
  66. {
  67. break;
  68. }
  69. }
  70. }
  71. void HeapSort(ElemType A[],int len)
  72. {
  73. int i;
  74. //建立大根堆
  75. for(i=len/2;i>=0;i--)
  76. {
  77. AdjustDown(A,i,len);
  78. }
  79. swap(A[0],A[len]);//交换顶部和数组最后一个元素
  80. //下面的策略就是,不但调整剩余元素为大根堆,因为根部最大,所以再次与A[i]交换(相当于放到数组后面),循环往复
  81. for(i=len-1;i>0;i--)
  82. {
  83. AdjustDown(A,0,i);//剩下元素调整为大根堆
  84. swap(A[0],A[i]);
  85. }
  86. }
  87. int main() {
  88. SSTable ST;
  89. ST.TableLen=10;
  90. ST.elem=(ElemType*) malloc(sizeof (ElemType)*ST.TableLen);
  91. for (int i = 0; i < ST.TableLen; ++i) {
  92. scanf("%d",&ST.elem[i]);
  93. }
  94. SelectSort(ST.elem,10);
  95. Print_ST(ST);
  96. HeapSort(ST.elem,10);
  97. Print_ST(ST);
  98. return 0;
  99. }

 

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #define N 10
  5. typedef int ElemType;
  6. void Merge(ElemType A[],int low,int mid,int high)
  7. {
  8. static ElemType B[N];//加static的目的是无论多次递归,都只有一个B[N]
  9. int i,j,k;
  10. for(k=low;k<=high;k++)//复制元素到B中
  11. B[k]=A[k];
  12. //合并数组
  13. for(i=low,j=mid+1,k=i;i<=mid&&j<=high;k++)
  14. {
  15. if(B[i]<=B[j])
  16. A[k]=B[i++];
  17. else
  18. A[k]=B[j++];
  19. }
  20. while (i<=mid)//如果有剩余元素,接着放入即可
  21. A[k++]=B[i++];//前一半有剩余的放入
  22. while (j<=high)//如果有剩余元素,接着放入即可
  23. A[k++]=B[j++];//后一半有剩余的放入
  24. }
  25. void MergeSort(ElemType A[],int low,int high)//递归分割
  26. {
  27. if(low<high)
  28. {
  29. int mid=(low+high)/2;
  30. MergeSort(A,low,mid);//排序好前一半
  31. MergeSort(A,mid+1,high);//排序好后一半
  32. Merge(A,low,mid,high);//将连个排序好的数组合并
  33. }
  34. }
  35. void print(int *a)
  36. {
  37. for (int i = 0; i < N; ++i) {
  38. printf("%3d",a[i]);
  39. }
  40. printf("\n");
  41. }
  42. int main() {
  43. int A[10]={12,63,58,95,41,35,65,0,38,44};
  44. MergeSort(A,0,9);
  45. print(A);
  46. return 0;
  47. }

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/441836
推荐阅读
相关标签
  

闽ICP备14008679号