分治法实现三分搜索算法(java版)

  1. 算法原理
    三分搜索和二分搜索类似,采用分治法。即将一个序列分为三组,对每组的序列继续分三组,一直分到只有一个元素为止。优点是查找速度快,缺点就是需要有序的序列。
    首先将有序序列分成三组,将中间两个分组的点与关键字X进行比较,如相同则退出找到,若不相等,在根据关键字与节点的大小比较在哪个组里,然后继续分组比较。重复上述过程,直到找到满足条件的记录。

  2. 算法流程
    假设有序序列为a={1,2,3,4,5,6,7,8,9}。查找元素x=8,流程如下:
    首先将序列分成三组,令mid1=3,mid2=6。
    第一次比较, x与mid1和mid2进行比较, x>mid2,因此在第三组查找{7,8,9}。
    将序列分成三组,令mid1=7,mid2=8。
    第二次比较,x与mid1和mid2进行比较,x=mid2,查找成功。
    最终结果,查找次数两次,对应数值序号为7。

  3. 实现代码

import java.util.Scanner;

public class Search1 {
    public int Tsearch(int[] temp,int key){
        int low = 0;
        int high = temp.length-1;
        int mid1;
        int mid2;
        if(temp[low] > key || temp[high] < key || low > high){
            return -1;
        }
        while (low <= high){
            mid1 = 1+(low+high)/3;
            mid2 = 1+(low+high)*2/3;
            if(temp[low] == key) {
                return low+1;
            }
            if(temp[high] == key) {
                return high+1;
            }
            if(temp[mid1] == key){
                return mid1+1;
            }
            if(temp[mid2] == key){
                return mid2+1;
            }
            if(key < temp[mid1]){
                high = mid1-1;
            }
            if(key > temp[mid2]){
                low = mid2+1;
            }
            if(key > temp[mid1] && key < temp[mid2]) {

                low = mid1+1;
                high = mid2-1;
            }
        }
        return  -1;
    }
    public static void main(String[] args) {
        System.out.println("请输入序列长度:");
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] temp = new int[n];
        System.out.println("按有序输入的序列元素有:");
        for (int i = 0; i < temp.length; i++) {
            temp[i] = scanner.nextInt();
        }
        System.out.println("有序序列为:");
        for (int i = 0; i < temp.length-1; i++) {
            System.out.print(temp[i] + "\t");
        }
        System.out.println(temp[temp.length-1]);
        System.out.println("请输入要查找的关键字:");
        Search1 s = new Search1();
        Scanner scanner1 = new Scanner(System.in);
        int t = scanner1.nextInt();
        int x = s.Tsearch(temp,t);
        if(x != -1){
            System.out.println("查找成功,在序列的第" + s.Tsearch(temp,t) + "个位置");
        }else {
            System.out.println("未找到");
        }
    }
}

  1. 演示截图
    首先输入序列长度以及序列
    在这里插入图片描述
    输入要查到的关键字
    成功演示
    在这里插入图片描述
    失败演示
    在这里插入图片描述
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值