查找就是根据给定的某个值,在查找表中的确定一个其关键字等于给定值得数据元素。(或记录)
顺序查找(静态查找):最基本的查找技术,查找过程是从第一个(或最后一个)记录开始,一直到查找到给定值,结束查找。
class test(int n, int key)
for(int i=0; i<n ; i++){
if(i==key){
return i;//查找到指定的值 结束查找。
}
}
}
时间复杂度O[n+1]/2=O[n]
优化顺序查找
每次循环都需要对i进行判定是否越界。其实可以设置一个哨兵,可以解决每次i 与 n 的比较。就是不用每次都比较。
class test2(int a[], int n, int key){
int i;
a[0] = key; // 设置a[0] 为关键字,我们称之为 ‘哨兵’
i = n; //循环从 数组的尾部开始
while(a[i] != key){
i-- ;
}
return i;//返回 0 说明失败;
}
时间复杂度O[n+1]/2=O[n]
有序查找
1.折半查找(Binary Search):有叫做二分查找。前提条件,在线性表中的记录必须是关键码有序(通常是从小到大),线性表必须采用顺序存储。
基本思想:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,查找成功。若给定值小于中间记录的关键字,则在中间记录的左半区继续查找不断重复。直到成功。或失败。
class test3(int a[], int n, int key){
int low,high,mid;
low = 1;//定义最低下标 ,暂不考虑0下标。
hieh = n;//定义最高下标。
while(low<=hieh){
mid = (low+hieh)/2; //茶找中间下标
if(key<a[mid]){ // key 小于 中值
high = mid - 1;// 高位小标 调整到 中位下标的下一位
}else if(key > a[mid]){ //key 大于 中值
low = mid +1 ; // 最低下标 调整到 中位下标的上一位
}else{
System.out.print("位置下标是:"+mid+"---下标值是:"+a[mid]);
return mid; //等于 这就是我们要查找的位置。
}
return 0;
}
}
时间复杂度 O[logn] (优于 O[n]),就是有前提条件。
插值查找 (优化上面的对折查找)
根据key与查找表的最大最小记录的值比较后查找方法。核心是插值的计算公式
(key-a[low])/ ( a[high] - a[low] )
class test3(int a[], int n, int key){
int low,high,mid;
low = 1;//定义最低下标 ,暂不考虑0下标。
hieh = n;//定义最高下标。
while(low<=hieh){
//mid = (low+hieh)/2;
mid = (key - a[low])/(a[high]-a[low])*(high-low)+1;//上一句优化为这句
if(key<a[mid]){ // key 小于 中值
high = mid - 1;// 高位小标 调整到 中位下标的下一位
}else if(key > a[mid]){ //key 大于 中值
low = mid +1 ; // 最低下标 调整到 中位下标的上一位
}else{
System.out.print("位置下标是:"+mid+"---下标值是:"+a[mid]);
return mid; //等于 这就是我们要查找的位置。
}
return 0;
}
}
时间复杂度 O[logn]
斐波那契查找太复杂 不会。。。
泡沫排序
class test5(){
int i,j;
int val[] = {9,8,6,1,47,2,21};
for(i=0; i<val.length.i++){
for(j=val.length-1;j>=i;j--){
if(val[j] > val[j+1]){
int sw = val[i];
val[j] = val[i];
val[i] = sw;
}
}
}
}
简单选择排序
class test6(){
int i,j,index;
int val[] = {....省略}
for(i=0;i<vaL.length;i++){
index = i;
for(j=i+1;j<=val.length;j++)
if(val[index] > val[j]){
index = j;
}
if(index != i){
int sw = val[j];
val[j] = val[index];
val[index] = sw;
}
}
}