(1)一个人只要自己不放弃自己,整个世界也不会放弃你.
(2)天生我才必有大用
(3)不能忍受学习之苦就一定要忍受生活之苦,这是多么痛苦而深刻的领悟.
(4)做难事必有所得
(5)精神乃真正的刀锋
(6)战胜对手有两次,第一次在内心中.
(7)编写实属不易,若喜欢或者对你有帮助记得点赞+关注或者收藏哦~
Java SE 036 Java数组查找方式及二分查找剖析
1.数组查找
public class ArraySearchTest{
public static int search(int [] a , int value){
for(int i = 0 ; i < a.length ; i ++){
if(a[i] == value){
return i;
}
}
return -1;
}
public static void main(String [] args){
int [] a = new int[]{
1,4,2};
int value = 3;
System.out.println(search(a,value));
}
}
这种查找是属于直接查找方式,效率是最低的,为什么会效率低,如果数组的长度非常长,如果是10000个,就需要比较10000次。这个代价是相当大的。
2.二分查找(Binary Search)
(1)要求:待查找的数组要有序。升序降序都可以。
(2)二分查找是在数组是有序的前提下,将数组一分为二,直接拿中间的元素与待查找的元素进行比较,如果中间的数小于待查找的数,因此,中间的数之前的数都会小于待查找的数,所以将中间的数之前的数全都忽略掉。肯定是不符合要求的。然后再将剩下的数再取中间数,然后再次与待比较数进行比较,依次比较,过滤掉中间数之前的数。
(3)简单说:排序取中间
public class ArrayBinarySearchTest
{
public static int binarySearch(int [] a,int value){
int low = 0 ; //数组中第一个元素的下标
int high = a.length - 1;//数组中最后一个元素的下标
//取中间元素。它是我们要跟待比较那个value值进行比较的那个元素它的索引在什么地方。
int middle;
//什么情况下让它一直能去进行判断,只要low不大于这个high就可以一直去判断。
while(low <= high){
//确定中间元素,索引的位置
middle = (low + high)/2;
for(int i = 0 ; i < a.length; i++){
System.out.print(a[i]);
if(i == middle){
System.out.print("#");//标记一下中间元素的位置
}
System.out.print(" ");
}
System.out.println();
//用中间元素与value进行比较
if(a[middle]==value){
return middle;
}
//如果没找到,有两种情况,一种是小于value,一种是中间的元素大于value,如果中间的元素小于value,则中间元素以及中间元素左边的元素都不要,
//如果是大于的话,中间元素以及中间元素右边的也都不要
if(a[middle]<value){
low = middle + 1;//即将中间的元素与中间元素左边的元素都过滤掉,这时对最右边元素下标没有影响,只对最左边元素下标有影响
}
if(a[middle]>value){
high = middle-1;//即将中间的元素与中间元素右边的元素都过滤掉。这时对最左边元素下标没有影响,只对最右边元素下标有影响
}
}
return -1;
}
public static void main(String [] args){
int[] a = new int[]{
11,22,44,992,809,928,443,222};
//冒泡排序
for(int i = 0 ; i < a.length-1; i++){
//为何length-1,length-1就是最后一个元素的下标
for(int j = 0 ; j < a.length-i-1; j++){
if(a[j]>a[j+1]){
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
int value = 1;
int index = binarySearch(a,value);
System.out.println(index);
}
}