【手撕代码】二分查找:递归和非递归实现

梦里梦外; 2022-02-16 01:45 364阅读 0赞

本文主要讲述面试现场常遇见的手撕代码题:二分查找。虽然代码很好理解也很简单,但是感觉只有多练,多理解才能真的掌握。千万不要眼高手低,稳扎稳打才是王道。

一、非递归版本

  1. public class BinarySearch {
  2. /**
  3. * 非递归实现
  4. * @param array : 有序数组
  5. * @param key :需要查找的数
  6. * @return :返回 key 在数组 array 中的下标
  7. */
  8. public static int binarySearch(int[] array, int key){
  9. if(array.length < 1){
  10. return -1;
  11. }
  12. int mid;
  13. int start = 0;
  14. int end = array.length - 1;
  15. while(start <= end){
  16. // 为了防止int溢出,最好这样写
  17. mid = (end - start) / 2 + start;
  18. if(key > array[mid]){
  19. start = mid + 1;
  20. }else if(key < array[mid]){
  21. end = mid - 1;
  22. }else{
  23. return mid; // 找到了
  24. }
  25. }
  26. return -1; // 没找到
  27. }
  28. public static void main(String[] args) {
  29. int[] arr = {1,2,3,4,5};
  30. System.out.println(binarySearch(arr,3));
  31. }
  32. }

二、递归版本实现

  1. public class BinarySearchWithRecursion {
  2. public static int binarySearch(int[] array, int key){
  3. if(array.length < 1){
  4. return -1;
  5. }
  6. int index = binarySearch(array, key, 0, array.length - 1);
  7. return index;
  8. }
  9. public static int binarySearch(int[] array, int key, int start, int end){
  10. int mid = (end - start) / 2 + start;
  11. // 递归终止条件
  12. if(array[mid] == key){
  13. return mid;
  14. }
  15. if(start >= end){
  16. return -1;
  17. }else if(key > array[mid]){
  18. return binarySearch(array, key, mid + 1, end);
  19. }else if(key < array[mid]){
  20. return binarySearch(array, key, start, mid - 1);
  21. }
  22. return -1;
  23. }
  24. public static void main(String[] args) {
  25. int[] arr = {1,2,3,4,5,6};
  26. System.out.println(binarySearch(arr, 6));
  27. }
  28. }

发表评论

表情:
评论列表 (有 0 条评论,364人围观)

还没有评论,来说两句吧...

相关阅读