非有序数组三分查找算法详解 - D语言实现
在非有序数组中使用三分查找查找某个元素,可以按照以下步骤实现:
-
定义一个函数,命名为'ternarySearch',该函数接受三个参数:一个整数数组'arr',要查找的目标元素'target',数组的起始和结束索引'left'和'right'。
-
在函数内部,使用一个while循环,判断'left'是否小于等于'right',如果是,则执行下一步,否则返回-1,表示未找到目标元素。
-
在循环内部,首先计算两个分割点'mid1'和'mid2',分别为'left + (right - left) / 3'和'right - (right - left) / 3'。
-
比较'arr[mid1]'和'arr[mid2]'与目标元素'target'的大小关系。如果'arr[mid1]'等于'target',则返回'mid1'。如果'arr[mid2]'等于'target',则返回'mid2'。
-
如果'arr[mid1]'大于'target',则在左半部分继续查找,将'right'更新为'mid1 - 1',并继续循环。如果'arr[mid2]'小于'target',则在右半部分继续查找,将'left'更新为'mid2 + 1',并继续循环。
-
如果以上条件都不满足,则在中间部分继续查找,将'left'更新为'mid1 + 1',将'right'更新为'mid2 - 1',并继续循环。
-
如果循环结束仍未找到目标元素,则返回-1,表示未找到。
以下是用D语言实现的代码示例:
import std.stdio;
int ternarySearch(int[] arr, int target, int left, int right) {
while (left <= right) {
int mid1 = left + (right - left) / 3;
int mid2 = right - (right - left) / 3;
if (arr[mid1] == target) {
return mid1;
}
if (arr[mid2] == target) {
return mid2;
}
if (arr[mid1] > target) {
right = mid1 - 1;
} else if (arr[mid2] < target) {
left = mid2 + 1;
} else {
left = mid1 + 1;
right = mid2 - 1;
}
}
return -1;
}
void main() {
int[] arr = [1, 3, 5, 7, 9, 11, 13, 15];
int target = 11;
int index = ternarySearch(arr, target, 0, arr.length - 1);
if (index != -1) {
writeln('找到目标元素 ', target, ',索引为 ', index);
} else {
writeln('未找到目标元素 ', target);
}
}
在上述代码中,我们定义了一个'ternarySearch'函数来实现三分查找。在'main'函数中,我们定义了一个非有序数组'arr',并调用'ternarySearch'函数来查找目标元素'target'。最后,根据返回值判断是否找到目标元素,并输出结果。
原文地址: https://www.cveoy.top/t/topic/qkPB 著作权归作者所有。请勿转载和采集!