经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
分治与递归-线性时间选择
来源:cnblogs  作者:DNE  时间:2018/10/16 9:17:24  对本文有异议

问题描述:给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n个元素中第k个元素。

算法描述:

算法实现:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. int main()
  5. {
  6. void sord(int a[],int h,int t);
  7. int selectorder(int x,int a[],int h,int t);
  8. int partition(int a[],int h,int t,int k);
  9. int n;
  10. scanf("%d",&n);
  11. int *a;
  12. a=(int *)malloc(sizeof(int)*n);
  13. for(int i=0;i<n;i++)
  14. a[i]=rand();
  15. for(int i=0;i<n;i++)
  16. printf("%d ",a[i]);//动态创建数组a并随机生成数组a元素、输出
  17. /*
  18. int n=15;
  19. int a[15]={41,58,96,7,5,857,589,415,27,398,215,86,71,88,85};
  20. for(int i=0;i<n;i++)
  21. printf("%d ",a[i]);*/ //检查程序时用的数组
  22. printf("\n");
  23. int k;
  24. scanf("%d",&k);//输入k
  25. int answer;//order-1
  26. if(k>n)printf("scan error");//k>n,输入错误
  27. else
  28. {
  29. answer=selectorder(k-1,a,0,n-1);//调用selectorder函数,
  30. //得到第k小元素并赋值给answer
  31. printf("%d\n",answer);
  32. }
  33. sord(a,0,n-1);
  34. for(int i=0;i<n;i++)printf("%d ",a[i]);//对数组a中元素进行选择排序、输出,为了检查程序
  35. return 0;
  36. }
  37. void sord(int *a,int h,int t)//对数组a中(从第h个到第t个)元素进行选择排序
  38. {
  39. int temp;
  40. int i,j;
  41. for(i=h;i<=t-1;i++)
  42. for(j=i+1;j<=t;j++)
  43. if(a[i]>a[j])
  44. {temp=a[i];a[i]=a[j];a[j]=temp;}
  45. }
  46. int partition(int *a,int h,int t,int k)//根据元素k将数组a(从第h个到第t个)
  47. //划分成元素小于k的左半部分和大于k的右半部分
  48. {
  49. int i=h;
  50. int j=t;
  51. int temp;
  52. while(i<j)
  53. {
  54. while(a[i]<k)i++;
  55. while(a[j]>k)j--;
  56. temp=a[i];a[i]=a[j];a[j]=temp;
  57. }
  58. for(int j=h;j<=t;j++)if(a[j]==k)break;
  59. a[j]=a[i];a[i]=k;
  60. return i;
  61. }
  62. int selectorder(int x,int *a,int h,int t)
  63. {
  64. if(t-h+1<75)
  65. {
  66. if(t>h)sord(a,h,t);
  67. return a[x];
  68. }//如果当前数组范围内元素个数小于75,
  69. //对此范围内数组元素进行选择排序并返回a[x]
  70. else
  71. {
  72. int i;
  73. int temp;
  74. for(i=0;i<=(t-h-4)/5;i++)
  75. {
  76. sord(a,h+i*5,h+i*5+4);
  77. temp=a[h+i];
  78. a[h+i]=a[h+i*5+2];
  79. a[h+i*5+2]=temp;
  80. }//将n个元素划分成?n/5?个组,
  81. //对每个组进行选择排序,
  82. //将每个组的中位数调到数组前部
  83. int k=selectorder(h+((t-h-4)/5)/2,a,h,h+(t-h-4)/5);
  84. //找出位于数组前部中每个组的中位数中的中位数
  85. i=partition(a,h,t,k);
  86. //根据k对数组a(从第h个到第t个)进行划分,
  87. //左边元素值比k小,右边元素比k大,
  88. //返回i为k在数组中的位置
  89. if(i==x)return(a[i]);//找到数组中第x+1小元素
  90. else
  91. {
  92. int j=i+1;
  93. if(x<j)return selectorder(x,a,h,i-1);//从k的左半部分数组元素中找第x+1小元素
  94. else return selectorder(x,a,j,t);//从k的右半部分数组元素中找第x+1小元素
  95. }
  96. }
  97. }

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号