首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

三分查找算法C語言實現:原理、代碼與遞歸/迭代對比

     編輯:關於C語言

三分查找:在凸函數/單峰函數上尋找極值的利器

算法原理

二分查找要求序列單調;三分查找針對凸性(單峰)函數,將區間三等分,通過比較兩個中間點值,縮小搜索範圍至1/3,常用於三元搜索求極值。

C語言迭代實現 (查找有序數組中目標值)

#include <stdio.h>
#define M 10
int ternary_search(int arr[], int n, int target) {
    int left = 0, right = n - 1;
    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 (target < arr[mid1]) right = mid1 - 1;
        else if (target > arr[mid2]) left = mid2 + 1;
        else { left = mid1 + 1; right = mid2 - 1; }
    }
    return -1;
}
int main() {
    int a[M] = {1,2,3,4,5,6,7,8,9,10};
    int x; printf("Input target: "); scanf("%d", &x);
    int pos = ternary_search(a, M, x);
    if (pos >= 0) printf("Found at index %d\n", pos);
    else puts("Not found");
    return 0;
}

關鍵區別:三分查找 vs 二分查找

特性二分查找三分查找
適用序列單調遞增/遞減凸函數/單峰函數(先升後降或先降後升)
分割方式二等分三等分
比較次數每輪1次每輪2次
時間複雜度O(log₂ n)O(log₃ n) ≈ O(log₂ n)
常見用途精確查找/邊界定位實數域極值搜索/三元搜索

💡 實戰提示

  • 整數數組精確查找二分更簡潔高效,三分常數因子更大。
  • 浮點數/連續函數求極值時,三分(三元搜索)是標準解法,迭代100次或直到區間< 1e-9。
  • 本文代碼演示的是「在有序數組中查找」的教學版三分,實際工程中極少用於此場景。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved