前言:
代码分析:2分查找的时间复杂度为O(log2n),3分查找的时间复杂度是O(3log3n),故2分查找的效率更好。
本文当中的2分查找和3分查找的数组都是有序的。
一.3分查找将数组分为3部分,1/3处和2/3处。思想和2分查找的思想一样。代码如下:
#include<iostream>
#include<string>
using namespace std;
int F(int arr[], int l, int r, int m) {
int mid1 = (r - l) / 3 + l;
int mid2 = (r - l) * 2 / 3 + l;
if (l <= r) {
if (arr[mid1] == m) {
return mid1;
}
else if (arr[mid1] > m) {
r = mid1 - 1;
return F(arr, l, r, m);
}
else if (arr[mid2] == m) {
return mid2;
}
else if (arr[mid2] > m) {
l = mid1 + 1;
r = mid2 - 1;
return F(arr, l, r, m);
}
else {
l = mid2 + 1;
return F(arr, l, r, m);
}
}
return -1;
}
int main() {
int a[] = { 1,2,3,4,5,6,7,8,9,10 };
int m = 6;
int n = F(a, 0, 9, m);
cout << n;
}
二.2分查找,直接上代码
#include<iostream>
#include<string>
using namespace std;
int F(int arr[], int l, int r, int m) {
int mid = (l + r) / 2;
if (l <= r) {
if (arr[mid] == m) {
return mid;
}
else if (arr[mid] > m) {
r = mid - 1;
return F(arr, l, r, m);
}
else {
l = mid + 1;
return F(arr, l, r, m);
}
}
return -1;
}
int main() {
int a[] = { 1,2,3,4,5 };
int m = 2;
int n = F(a, 0, 4, m);
cout << n;
}
代码分析:2分查找的时间复杂度为O(log2n),3分查找的时间复杂度是O(3log3n),故2分查找的效率更好。