恩,昨天弄了哈二分查找,先来回忆一下二分查找的重要的知识点
1.有序的数组才能使用二分查找
2.二分查找法的效率很高,2的对数来得到二分法的查找次数。
3.二分查找法的原理
从一个有序数组中查找一个值,首先得到该数组的长度一半的(也就是得到该有序数组的中间值)的值,跟要查找的值进行比较,如果该值等于要查找的值,那么就结束了,如果该值大于要查找的值,那么我们的查找范围缩小,也就是说,这时我们要把我们查找的最大的的下标的值设置成为刚得到的下标。反之,我们则把最小的下标设置成为刚得到的下标值。按照这样的循环方式,最后查找到要查找的值,如果该数组中确实不存在该值,最后我们的最小下标会大于最大下标。此时查找就应该结束了。
核心代码如下:
while(true){
current = (min + max)/2;
if(a[current] == searchKey){
return current;
}else if(min>max){
return nElems;
}else if(a[current] >searchKey){
max = current-1;
}else if(a[current] <searchKey){
min = current+1;
}
}
上面说到的是二分查找法,二分查找法执行的一个前提是,有序数组,那么我们现在要说的就是怎么让一个数组变得有序起来—排序。
排序有多种,下面慢慢道来。
一:冒泡排序—最简单,但应该是最慢的排序
实现代码:
for(int out = a.length-1; out>1 ; out--){//排完一次,确定一个最大值,之后就少排一次
for(int in = 0 ; in < out; in++){//循环比较内层,根据外层比较的长度变小,相应的内层比较次数变少
if(a[in]>a[in+1]){
int temp = a[in];
a[in] = a[in+1];
a[in+1] = temp;
}
}
}
从上面可以看到,如果是10个的数据的数组,他的比较次数应该是:9+8+7+……+1=45
也即:(N-1)+(N-2)+……+1=N*(N-1)/2。效率可想而知。
(未完待续)