学习查找技术

查找就是根据给定的某个值,在查找表中的确定一个其关键字等于给定值得数据元素。(或记录)
顺序查找(静态查找):最基本的查找技术,查找过程是从第一个(或最后一个)记录开始,一直到查找到给定值,结束查找。

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;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值