[关闭]
@chawuciren 2018-12-05T15:03:29.000000Z 字数 1999 阅读 611

找阈值

T


3500个数字排序

结果

在我的电脑上找到了:10
跑了很多次都在10附近
本来想做个折线图,打开表格宕机了,先拿表格凑合

遇到的问题

运行程序慢
效率提高不明显
结果和正确答案有出入
10000万溢出了
100万以上没有溢出的时候都是段错误
我也不知道为什么

修改了main,不用一直改数字

  1. int main(){
  2. int array[M];
  3. for(int j=50;j>0;j--){
  4. printf("%d:\n",j);
  5. for(int i=0;i<5;i++){
  6. double duration;
  7. create_Ary(array,M);
  8. clock_t start, finish;
  9. start = clock();
  10. quicksort(array,0,M,j);
  11. finish = clock();
  12. duration = (double)(finish - start) / CLOCKS_PER_SEC;
  13. //print(array,M);
  14. printf( "%f seconds\n", duration );
  15. //elapsed_time();
  16. }
  17. }
  18. return 0;
  19. }

下面是原程序

  1. #include<stdio.h>
  2. #include<time.h>
  3. #include<stdlib.h>
  4. #define M 5000//调整这个改变排序的数的个数
  5. void SelectionSort(int a[],int p,int r);//选择排序
  6. void create_Ary (int a[], int n);//制造随机数组
  7. int partition(int array[],int p,int r);//将数组分成大于某个数和小于某个数两部分
  8. void exchange(int *p,int *q);//交换函数
  9. void print(int array[],int len);//打印数组元素
  10. void quicksort(int array[],int p,int r);//快速排序
  11. int main(){
  12. int array[M];
  13. double duration;
  14. create_Ary(array,M);
  15. clock_t start, finish;
  16. start = clock();
  17. quicksort(array,0,M);
  18. finish = clock();
  19. duration = (double)(finish - start) / CLOCKS_PER_SEC;
  20. //print(array,M);
  21. printf( "%f seconds\n", duration );
  22. //elapsed_time();
  23. return 0;
  24. }
  25. void quicksort(int array[],int p,int r){
  26. int q=0;
  27. if(r-p<20){
  28. SelectionSort(array,p,r);
  29. }
  30. else{
  31. if(p<r){
  32. q=partition(array,p,r);
  33. quicksort(array,p,q);
  34. quicksort(array,q+1,r);
  35. }
  36. }
  37. }
  38. int partition(int array[],int p,int r){
  39. int x=array[r-1];
  40. int i=p-1;
  41. for(int j=p;j<r-1;j++){//最后一个数内定了
  42. if(array[j]<=x){
  43. exchange(&array[i+1],&array[j]);
  44. i+=1;
  45. }
  46. }
  47. exchange(&array[i+1],&array[r-1]);
  48. i++;
  49. return i;
  50. }
  51. void exchange(int *p,int *q){
  52. int t=*p;
  53. *p=*q;
  54. *q=t;
  55. return;
  56. }
  57. void print(int array[],int len){
  58. for(int i=0;i<len;i++){
  59. printf("%d ",array[i]);
  60. }
  61. return;
  62. }
  63. void elapsed_time(){
  64. printf("Elapsed time:%lu secs.\n",clock()/CLOCKS_PER_SEC);
  65. }
  66. void create_Ary (int a[], int n)
  67. {
  68. srand(time(0)); //使随机数函数 rand 产生一序列随机数而设置种子值
  69. int i,j,x;
  70. i = 0;
  71. while (i<n)
  72. {
  73. x=rand( );
  74. if (x>=10000) //产生两位在 10≤而<100 范围内的数
  75. continue;
  76. j=0;
  77. while (j<=i&&a[j]!=x) //舍弃相同元素
  78. j++;
  79. if (j>i)a[i++]=x; //不同的元素送入数组
  80. }
  81. }
  82. void SelectionSort(int a[],int p,int r){
  83. int i,j;
  84. for(i = p ; i < r-1 ; i++){
  85. int min_index = i;
  86. for(j = i + 1 ; j < r; j++)
  87. if(a[ min_index ] > a[j])
  88. min_index = j;
  89. if(min_index != i){
  90. int temp = a[i];
  91. a[i] = a[min_index];
  92. a[min_index] = temp;
  93. }
  94. }
  95. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注