fork(3) download
  1. #include <iostream>
  2. #include <time.h>
  3. using namespace std;
  4.  
  5. #define min(a,b) ((a) < (b) ? (a) : (b))
  6.  
  7. int numswaps = 0;
  8. void swap(int a[], int i, int j)
  9. {
  10. int tmp = a[i]; a[i] = a[j]; a[j] = tmp;
  11. numswaps++;
  12. }
  13.  
  14. int select(int a[], int k, int l, int r);
  15. void printArr(int a[], int l, int r)
  16. {
  17. for (int i=l; i<=r; ++i)
  18. printf("%i ", a[i]);
  19. printf("\n");
  20. }
  21.  
  22. void insertSort(int a[], int l, int r)
  23. {
  24. for (int i=l+1; i<=r; ++i)
  25. {
  26. int j = i;
  27. while (j>l && a[j] < a[j-1])
  28. {
  29. swap(a,j,j-1);
  30. j--;
  31. }
  32. }
  33. }
  34.  
  35. int medMed(int a[], int l, int r)
  36. {
  37. int j = l-1;
  38. for (int i=l; i<=r; i+=5)
  39. {
  40. int rr = min(i+4,r);
  41. insertSort(a,i,rr);
  42. swap(a,++j,(i+rr)/2);
  43. }
  44. int m = (j-l)/2+1;
  45. return select(a,m,l,j);
  46. }
  47.  
  48. int partition(int a[], int l, int r)
  49. {
  50. int pp = medMed(a,l,r);
  51. swap(a[pp],a[r]);
  52. int p = a[r];
  53. int i = l-1;
  54. for (int j=l; j<r; ++j)
  55. if (a[j] < p)
  56. swap(a,++i,j);
  57. swap(a,++i,r);
  58. return i;
  59. }
  60.  
  61. int numselect = 0;
  62. int select(int a[], int k, int l, int r)
  63. {
  64. numselect++;
  65. if (l>r) { printf("error l>r\n"); exit(-1); }
  66. if (l==r) { if (k == 1) return l; printf("error k!=1"); exit(-1); }
  67. int p = partition(a,l,r);
  68. if (k<p+1-l) select(a,k,l,p-1);
  69. else if (k>p+1-l) select(a,k-(p+1-l),p+1,r);
  70. else return p;
  71. }
  72.  
  73. const int SIZE = 10000000;
  74. int arr[SIZE+1];
  75. void generate()
  76. {
  77. numswaps = 0;
  78. numselect = 0;
  79. for (int i=0; i<=SIZE; ++i)
  80. arr[i] = rand();
  81. }
  82. void verify(int s)
  83. {
  84. int last = -1;
  85. for (int i=1; i<=s; ++i)
  86. {
  87. int cur = select(arr,i,0,s);
  88. if (last > cur) { printf("invalid"); exit(-2); }
  89. last = cur;
  90. }
  91. }
  92. int main() {
  93. clock_t begin = clock();
  94. for (int i=1; i<=SIZE; i*=10)
  95. {
  96. generate();
  97. select(arr,(1+i)/2,1,i);
  98. printf("#swaps for finding median of %8i elements: %8i (%i)\n", i, numswaps, numselect);
  99. }
  100. clock_t end = clock();
  101. double time = (double)(end - begin) / CLOCKS_PER_SEC;
  102. printf("Total time: %f", time);
  103. return 0;
  104. }
Success #stdin #stdout 2.68s 42360KB
stdin
Standard input is empty
stdout
#swaps for finding median of        1 elements:        0 (1)
#swaps for finding median of       10 elements:       16 (3)
#swaps for finding median of      100 elements:      436 (23)
#swaps for finding median of     1000 elements:     5182 (142)
#swaps for finding median of    10000 elements:    53527 (581)
#swaps for finding median of   100000 elements:   549237 (2708)
#swaps for finding median of  1000000 elements:  5631455 (11244)
#swaps for finding median of 10000000 elements: 55046982 (47626)
Total time: 2.680000