fork download
  1. #define BUBBLE // INSERTION SELECTION
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <malloc.h>
  6. #include <time.h>
  7.  
  8. void sort(int *data, int n);
  9.  
  10. int compare(int a, int b);
  11.  
  12. void swap(int *d, int a, int b);
  13.  
  14. void initRandData(int *d, int n);
  15.  
  16. void initAscendingData(int *d, int n);
  17.  
  18. void initDescendingData(int *d, int n);
  19.  
  20. void printdata(int *d, int n);
  21.  
  22. unsigned long counterSwap;
  23. unsigned long counterComp;
  24.  
  25. void sort(int data[], int n)
  26. {
  27. #if defined BUBBLE
  28. int i, j;
  29. for (i = 0; i < n; i++) for (j = 1; j < n-i; j++) {
  30. if (compare(data[j], data[j-1])) swap(data, j, j-1);
  31. }
  32. #elif defined INSERTION
  33. int i, j;
  34. for (i = 0; i < n; i++) for (j = i; j > 0; j--) {
  35. if (compare(data[j], data[j-1])) swap(data, j, j-1);
  36. else break;
  37. }
  38. #elif defined SELECTION
  39. int i, j, k;
  40. for (i = 0; i < n; i++) {
  41. for (k = j = i; j < n; j++) {
  42. if (compare(data[j], data[k])) k = j;
  43. }
  44. swap(data, i, k);
  45. }
  46. #else
  47. #error Define one of BUBBLE, INSERTION, SELECTION
  48. #endif
  49. }
  50.  
  51. int main(void)
  52. {
  53. int *data;
  54. int n;
  55. int i;
  56. int com;
  57. void (* initData[3])(int *d, int x) = {initRandData,
  58. initAscendingData,
  59. initDescendingData };
  60.  
  61. do {
  62. printf("データタイプ(1-3)\n");
  63. printf("ランダム:1 昇順:2 降順:3 ");
  64. scanf("%d", &com);
  65. } while (! (com==0||com==1||com==2||com==3));
  66.  
  67. printf("データ数: ");
  68. scanf("%d", &n);
  69.  
  70. data = (int*) malloc(sizeof(int) *n);
  71. if (com==0) {
  72. for (i=0; i<n; i++) {
  73. scanf("%d", &data[i]);
  74. }
  75. } else {
  76. initData[com-1](data, n);
  77. }
  78.  
  79. #ifdef DEBUG
  80. printdata(data, n);
  81. #endif
  82.  
  83. counterSwap = 0;
  84. counterComp = 0;
  85.  
  86. sort(data, n);
  87.  
  88. #ifdef DEBUG
  89. printdata(data, n);
  90. #endif
  91.  
  92. printf(" 比較: %d 回\n", counterComp);
  93. printf(" 交換: %d 回\n", counterSwap);
  94.  
  95. return 0;
  96. }
  97.  
  98. int compare(int a, int b)
  99. {
  100. counterComp++;
  101. return (a<b);
  102. }
  103.  
  104. void swap(int *d, int a, int b)
  105. {
  106. int tmp;
  107.  
  108. counterSwap++;
  109. tmp = d[a];
  110. d[a] = d[b];
  111. d[b] = tmp;
  112. }
  113.  
  114. void initRandData(int *d, int n)
  115. {
  116. int i, s;
  117. srand(time(NULL));
  118. s=n*10;
  119. for(i=0; i<n; i++) d[i]=rand()%s;
  120. }
  121.  
  122. void initAscendingData(int *d, int n)
  123. {
  124. int i;
  125. for(i=0; i<n; i++) d[i]=i;
  126. }
  127.  
  128. void initDescendingData(int *d, int n)
  129. {
  130. int i;
  131. for(i=0; i<n; i++) d[i]=n-i-1;
  132. }
  133.  
  134. void printdata(int *d, int n)
  135. {
  136. int i;
  137.  
  138. for (i=0; i<n; i++) printf("%d ", d[i]);
  139. printf("\n");
  140. }
  141.  
Success #stdin #stdout 0s 2384KB
stdin
1
1000
stdout
データタイプ(1-3)
ランダム:1 昇順:2 降順:3  データ数:  比較: 499500 回
 交換: 252071 回