-
算法原理
三分搜索和二分搜索类似,采用分治法。即将一个序列分为三组,对每组的序列继续分三组,一直分到只有一个元素为止。优点是查找速度快,缺点就是需要有序的序列。
首先将有序序列分成三组,将中间两个分组的点与关键字X进行比较,如相同则退出找到,若不相等,在根据关键字与节点的大小比较在哪个组里,然后继续分组比较。重复上述过程,直到找到满足条件的记录。 -
算法流程
假设有序序列为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。 -
实现代码
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("未找到");
}
}
}
- 演示截图
首先输入序列长度以及序列
输入要查到的关键字
成功演示
失败演示