变体一: 查找第一个值等于给定值的元素

  • 在普通的二分查找算法基础上进行更改
  • 当找到指定值后, 不立即返回, 而是向前检测一位
  1. public int bsearch(int[] a, int n, int value) {
  2. int low = 0;
  3. int high = n - 1;
  4. while (low <= high) {
  5. int mid = low + ((high - low) >> 1);
  6. if (a[mid] > value) {
  7. high = mid - 1;
  8. } else if (a[mid] < value) {
  9. low = mid + 1;
  10. } else {
  11. if ((mid == 0) || (a[mid - 1] != value)) return mid;
  12. else high = mid - 1;
  13. }
  14. }
  15. return -1;
  16. }
  17. public int bsearch(int[] a, int n, int value) {
  18. int low = 0;
  19. int high = n - 1;
  20. while (low <= high) {
  21. int mid = low + ((high - low) >> 1);
  22. if (a[mid] >= value) {
  23. high = mid - 1;
  24. } else {
  25. low = mid + 1;
  26. }
  27. }
  28. if (low < n && a[low]==value) return low;
  29. else return -1;
  30. }

变体二: 查找最后一个值等于给定值的元素

  1. public int bsearch(int[] a, int n, int value) {
  2. int low = 0;
  3. int high = n - 1;
  4. while (low <= high) {
  5. int mid = low + ((high - low) >> 1);
  6. if (a[mid] > value) {
  7. high = mid - 1;
  8. } else if (a[mid] < value) {
  9. low = mid + 1;
  10. } else {
  11. if ((mid == n - 1) || (a[mid + 1] != value)) return mid;
  12. else low = mid + 1;
  13. }
  14. }
  15. return -1;
  16. }

变体三: 查找第一个大于等于给定值的元素

  1. public int bsearch(int[] a, int n, int value) {
  2. int low = 0;
  3. int high = n - 1;
  4. while (low <= high) {
  5. int mid = low + ((high - low) >> 1);
  6. if (a[mid] >= value) {
  7. if ((mid == 0) || (a[mid - 1] < value)) return mid;
  8. else high = mid - 1;
  9. } else {
  10. low = mid + 1;
  11. }
  12. }
  13. return -1;
  14. }

变体四: 查找最后一个小于等于给定值的元素

  1. public int bsearch7(int[] a, int n, int value) {
  2. int low = 0;
  3. int high = n - 1;
  4. while (low <= high) {
  5. int mid = low + ((high - low) >> 1);
  6. if (a[mid] > value) {
  7. high = mid - 1;
  8. } else {
  9. if ((mid == n - 1) || (a[mid + 1] > value)) return mid;
  10. else low = mid + 1;
  11. }
  12. }
  13. return -1;
  14. }