@生活冷战士 #和我一起去战斗!!!
好多人对于二分查找法有很多的疑惑,首先,递归,或者循环都可以实现的。接下来就可以查找了。。。
二分查找法思路
- 所谓二分法,其实就是在有序得数组中,折半,查找。
- 运用上我们前面所学的二分法排序。
- 下面是我敲的代码,以供大家参考
1、 循环
public class BinarySearch {
public static int binarySearch(int[] ary, int element) {
binarySort(ary);
int start = 0;
int end = ary.length - 1;
// 当首元素小于尾元素时
while (start <= end) {
// 1.找到中间点
int mid = (start + end) / 2;
// 2.判断中间点元素和查找元素的大小
// 中间点和查找元素相等的情况
if (ary[mid] == element) {
return mid;
} else if (ary[mid] < element) {
// 如果中间元素小于被查找元素
start = mid + 1;
} else {
// 如果中间元素大于被查找元素
end = mid - 1;
}
}
return -1;
}
public static void binarySort(int[] ary) {
for (int i = 0; i < ary.length; i++) {
int temp = ary[i];
int left = 0;
int right = i - 1;
int middle = 0;
while (left <= right) {
middle = (left + right) / 2;
if (temp < ary[middle]) {
right = middle - 1;
} else {
left = middle + 1;
}
}
for (int j = i - 1; j >= left; j--) {
ary[j + 1] = ary[j];
}
if (left != i) {
ary[left] = temp;
}
}
}
public static void main(String[] args) {
int[] ary = { 6, 23, 2, 3, 24, 8, 6, 30 };
System.out.println(Arrays.toString(ary));
int a=binarySearch(ary, 24);
System.out.println(Arrays.toString(ary));
System.out.println(a);
}
}
2、递归
public class BinarySearch {
public static int binarySearch(int[] ary, int key, int low, int high) {
binarySort(ary);
if (key < ary[low] || key > ary[high] || low > high) {
return -1;
}
int middle = (low + high) / 2;
if (ary[middle] > key) {
return binarySearch(ary, key, low, middle - 1);
} else if (ary[middle] < key) {
return binarySearch(ary, key, middle + 1, high);
} else {
return middle;
}
}
public static void binarySort(int[] ary) {
for (int i = 0; i < ary.length; i++) {
int temp = ary[i];
int left = 0;
int right = i - 1;
int middle = 0;
while (left <= right) {
middle = (left + right) / 2;
if (temp < ary[middle]) {
right = middle - 1;
} else {
left = middle + 1;
}
}
for (int j = i - 1; j >= left; j--) {
ary[j + 1] = ary[j];
}
if (left != i) {
ary[left] = temp;
}
}
}
public static void binarySort(int[] ary) {
for (int i = 0; i < ary.length; i++) {
int temp = ary[i];
int left = 0;
int right = i - 1;
int middle = 0;
while (left <= right) {
middle = (left + right) / 2;
if (temp < ary[middle]) {
right = middle - 1;
} else {
left = middle + 1;
}
}
for (int j = i - 1; j >= left; j--) {
ary[j + 1] = ary[j];
}
if (left != i) {
ary[left] = temp;
}
}
}
public static void main(String[] args) {
int[] ary = { 6, 23, 2, 3, 24, 8, 6, 30 };
System.out.println(Arrays.toString(ary));
int a = binarySearch(ary, 6, 0, ary.length - 1);
System.out.println(Arrays.toString(ary));
System.out.println(a);
}
}