fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. //no_search、常に-1返すだけ(演習0のやつ)
  5. int no_search(int *a, int n, int x){
  6. return -1; //探さないので-1のまま
  7. }
  8.  
  9. //線形探索、前から順に見るだけ(昇順とか関係ない)
  10. //O(n) → n個ならn回見る
  11. int linear_search(int *a, int n, int x){
  12. int ret = -1; //見つからなかった時用
  13. for(int i = 0; i < n; i++){
  14. if(a[i] == x){
  15. ret = i; //見つかった場所
  16. break; //最初の1個だけでOK
  17. }
  18. }
  19. return ret;
  20. }
  21.  
  22. //二分探索(前提条件として昇順じゃないといけない)
  23. //lef, mid, rig を使う。範囲を半分にしていく。
  24. //O(log n) → 半分ずつ減るので速い
  25. int binary_search(int *a, int n, int x){
  26. int lef = 0; //左端
  27. int rig = n - 1; //右端
  28.  
  29. while(lef <= rig){ //範囲が逆転したら終わり(ここが超大事)
  30. int mid = (lef + rig) / 2; //真ん中(小数点切り捨て)
  31.  
  32. if(a[mid] == x){
  33. return mid; //見つかった
  34. }
  35. else if(x < a[mid]){ //真ん中より左なら
  36. rig = mid - 1; //左側だけ残す
  37. }
  38. else{
  39. lef = mid + 1; //右側だけ残す
  40. }
  41. }
  42. return -1; //見つからなかった
  43. }
  44.  
  45. int main(void){
  46. int n, x;
  47. scanf("%d %d", &n, &x); //n個の配列、探したいx
  48.  
  49. //mallocでn個分確保(int1個のサイズ×n)
  50. int *a = (int *)malloc(sizeof(int) * n);
  51. //配列にn個入力
  52. for(int i = 0; i < n; i++){
  53. scanf("%d", &a[i]);
  54. }
  55.  
  56. //二分探索(課題1のやつ)
  57. int ans = binary_search(a, n, x);
  58. if(ans != -1){
  59. printf("a[%d] = %d\n", ans, a[ans]);
  60. }else{
  61. printf("not found\n");
  62. }
  63. free(a); //mallocしたらfree必須
  64.  
  65. return 0;
  66. }
Success #stdin #stdout 0.01s 5316KB
stdin
12 5
1 2 3 4 5 8 9 13 16 21 25 27
stdout
a[4] = 5