C语言实现三种经典查找算法:折半查找、二叉排序树查找、哈希表查找

查找算法是计算机科学中十分重要的基础算法,本文将介绍三种经典的查找算法:折半查找、二叉排序树查找以及哈希表查找,并给出相应的C语言代码实现。

一、折半查找算法的C语言实现

折半查找算法适用于有序数组,其基本思想是:将目标值与数组中间元素进行比较,如果相等则返回中间元素的索引,否则根据比较结果缩小查找范围,直到找到目标值或查找范围为空。

#include <stdio.h>

int binarySearch(int arr[], int n, int target) {
    int left = 0;
    int right = n - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (arr[mid] == target) {
            return mid;
        } else if (arr[mid] < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return -1;
}

int main() {
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int n = sizeof(arr) / sizeof(arr[0]);
    int target = 6;
    int result = binarySearch(arr, n, target);
    if (result != -1) {
        printf('Found at index %d\n', result);
    } else {
        printf('Not found\n');
    }
    return 0;
}

二、二叉排序树查找算法的C语言实现

二叉排序树是一种特殊的二叉树,其每个节点的左子树所有节点的值均小于该节点的值,右子树所有节点的值均大于该节点的值。查找时,从根节点开始比较,根据比较结果选择左子树或右子树继续查找,直到找到目标节点或到达叶子节点。

#include <stdio.h>
#include <stdlib.h>

typedef struct TreeNode {
    int data;
    struct TreeNode* left;
    struct TreeNode* right;
} TreeNode;

TreeNode* createNode(int data) {
    TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
    newNode->data = data;
    newNode->left = NULL;
    newNode->right = NULL;
    return newNode;
}

TreeNode* insertNode(TreeNode* root, int data) {
    if (root == NULL) {
        return createNode(data);
    }
    if (data < root->data) {
        root->left = insertNode(root->left, data);
    } else if (data > root->data) {
        root->right = insertNode(root->right, data);
    }
    return root;
}

TreeNode* searchNode(TreeNode* root, int target) {
    if (root == NULL || root->data == target) {
        return root;
    }
    if (target < root->data) {
        return searchNode(root->left, target);
    } else {
        return searchNode(root->right, target);
    }
}

int main() {
    TreeNode* root = NULL;
    root = insertNode(root, 8);
    insertNode(root, 3);
    insertNode(root, 10);
    insertNode(root, 1);
    insertNode(root, 6);
    insertNode(root, 14);
    insertNode(root, 4);
    insertNode(root, 7);
    insertNode(root, 13);

    int target = 6;
    TreeNode* result = searchNode(root, target);
    if (result != NULL) {
        printf('Found\n');
    } else {
        printf('Not found\n');
    }

    return 0;
}

三、哈希表查找的C语言实现

哈希表利用哈希函数将关键字映射到数组的某个位置,然后将数据存储在该位置。查找时,通过哈希函数计算关键字的哈希值,直接访问数组对应位置即可。哈希表查找效率高,但需要解决哈希冲突问题。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TABLE_SIZE 10

typedef struct HashNode {
    char name[50];
    struct HashNode* next;
} HashNode;

int hashFunction(char* name) {
    int sum = 0;
    for (int i = 0; i < strlen(name); i++) {
        sum += name[i];
    }
    return sum % TABLE_SIZE;
}

void insertNode(HashNode* hashTable[], char* name) {
    int index = hashFunction(name);
    HashNode* newNode = (HashNode*)malloc(sizeof(HashNode));
    strcpy(newNode->name, name);
    newNode->next = NULL;

    if (hashTable[index] == NULL) {
        hashTable[index] = newNode;
    } else {
        HashNode* current = hashTable[index];
        while (current->next != NULL) {
            current = current->next;
        }
        current->next = newNode;
    }
}

int searchNode(HashNode* hashTable[], char* name) {
    int index = hashFunction(name);
    HashNode* current = hashTable[index];
    while (current != NULL) {
        if (strcmp(current->name, name) == 0) {
            return 1;
        }
        current = current->next;
    }
    return 0;
}

int main() {
    HashNode* hashTable[TABLE_SIZE];
    for (int i = 0; i < TABLE_SIZE; i++) {
        hashTable[i] = NULL;
    }

    insertNode(hashTable, 'Alice');
    insertNode(hashTable, 'Bob');
    insertNode(hashTable, 'Charlie');
    insertNode(hashTable, 'David');
    insertNode(hashTable, 'Eva');

    char* target = 'Charlie';
    int result = searchNode(hashTable, target);
    if (result) {
        printf('Found\n');
    } else {
        printf('Not found\n');
    }

    return 0;
}

总结

本文介绍了三种常见的查找算法及其C语言实现,并提供了代码示例。在实际应用中,需要根据具体情况选择合适的查找算法,以获得最佳的性能。

C语言实现三种经典查找算法:折半查找、二叉排序树查找、哈希表查找

原文地址: https://www.cveoy.top/t/topic/f3YD 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录