二分查找的递归与非递归方式

拼搏现实的明天。 2023-02-25 10:24 108阅读 0赞

二分查找的递归与非递归方式:

二分查找的前提条件是:
数组有序,不能有相同值。

如果有相同值,只能先进行二分查找,得到一个下标后,再根据这个下标在数组中左右遍历别的值是否相等。


测试代码:

  1. import java.util.Arrays;
  2. /* * 关于二分查找: * */
  3. public class BinarySearchTest {
  4. public static void main(String[] args) {
  5. int[] arr = { -6, -1, 0, 3, 7, 12, 23, 55};
  6. int index1 = binarySearch(arr, 7, 0, arr.length-1);
  7. System.out.println(index1);
  8. int index2 = binarySearch02(arr, 55);
  9. System.out.println(index2);
  10. System.out.println("-------------------------------------------------------");
  11. int[] arr1 = { -1, 3, 6, 6, 4, 2, 1, 1, 4, 7, 6, 6, 6, 6, 4};
  12. //数组元素:-1 3 6 6 4 2 1 1 4 7 6 6 6 6 4
  13. //对应下标: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
  14. System.out.println(Arrays.binarySearch(arr1, 6)); //11
  15. System.out.println(Arrays.binarySearch(arr1, 4)); //8
  16. System.out.println(Arrays.binarySearch(arr1, 1)); //7
  17. //当元素有相同,且无序时,能找出其中一个值的下标,具体是哪一个,无法得知
  18. System.out.println("-------------------------------------------------------");
  19. //arr1排序后
  20. Arrays.sort(arr1);
  21. //数组元素:-1 1 1 2 3 4 4 4 6 6 6 6 6 6 7
  22. //对应下标: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
  23. System.out.println(Arrays.binarySearch(arr1, 6)); //11
  24. System.out.println(Arrays.binarySearch(arr1, 4)); //7
  25. System.out.println(Arrays.binarySearch(arr1, 1)); //1
  26. //当元素有相同,且无序时,能找出其中一个值的下标,具体是哪一个,也无法得知
  27. }
  28. //二分查找的递归方式
  29. private static int binarySearch(int[] arr, int num, int left, int right) {
  30. if (left > right) return -1;
  31. int middle = (left + right) / 2;
  32. if (arr[middle] == num) {
  33. return middle;
  34. } else if (arr[middle] < num) {
  35. return binarySearch(arr, num, middle + 1, right);
  36. }else{
  37. return binarySearch(arr, num, left, middle-1);
  38. }
  39. }
  40. //二分查找的非递归方式
  41. private static int binarySearch02(int[] arr, int num) {
  42. int start = 0;
  43. int end = arr.length-1;
  44. while (start <= end) {
  45. int middle = (start + end) / 2;
  46. if (arr[middle] > num) {
  47. end = middle - 1;
  48. } else if (arr[middle] < num) {
  49. start = middle + 1;
  50. } else {
  51. return middle;
  52. }
  53. }
  54. return -1;
  55. }
  56. }

注意:

1、二分查找不建议使用递归方式,效率太低。

2、当数组中有相同的元素,二分查找没办法定位准确的下标。

3、二分查找的前提条件是:有序,无重复。


发表评论

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

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

相关阅读