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

查找算法是计算机科学中十分重要的基础算法,用于在一个数据集中快速找到目标元素。本文介绍三种常用的查找算法,并提供C语言代码示例:

一、有序表的折半查找算法

折半查找,也称为二分查找,是一种高效的查找算法,适用于已排序的数据集。

算法步骤:

  1. 从数据集的中间元素开始比较,如果目标元素等于中间元素,则查找成功。
  2. 如果目标元素小于中间元素,则在数据集的左半部分继续查找。
  3. 如果目标元素大于中间元素,则在数据集的右半部分继续查找。
  4. 重复步骤1-3,直到找到目标元素或数据集为空。

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) / 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};
    int n = sizeof(arr) / sizeof(arr[0]);
    int target = 5;
    
    int result = binarySearch(arr, n, target);
    
    if (result == -1) {
        printf('Target not found\n');
    }
    else {
        printf('Target found at index %d\n', result);
    }
    
    return 0;
}

二、二叉排序树查找

二叉排序树是一种特殊的二叉树,其每个节点的值都大于其左子树的所有节点的值,小于其右子树的所有节点的值。

算法步骤:

  1. 从根节点开始比较,如果目标元素等于根节点的值,则查找成功。
  2. 如果目标元素小于根节点的值,则在左子树中继续查找。
  3. 如果目标元素大于根节点的值,则在右子树中继续查找。
  4. 重复步骤1-3,直到找到目标元素或到达空节点。

C语言代码示例:

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

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

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

Node* insertNode(Node* 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;
}

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

int main() {
    Node* root = NULL;
    
    root = insertNode(root, 4);
    root = insertNode(root, 2);
    root = insertNode(root, 6);
    root = insertNode(root, 1);
    root = insertNode(root, 3);
    root = insertNode(root, 5);
    root = insertNode(root, 7);
    
    int target = 5;
    Node* result = searchNode(root, target);
    
    if (result == NULL) {
        printf('Target not found\n');
    }
    else {
        printf('Target found\n');
    }
    
    return 0;
}

三、哈希表查找

哈希表是一种利用哈希函数将键映射到存储桶的数据结构,可以实现快速查找、插入和删除。

算法步骤:

  1. 使用哈希函数将目标元素的键映射到哈希表中的一个存储桶。
  2. 在该存储桶中查找目标元素。
  3. 如果找到,则查找成功。否则,查找失败。

C语言代码示例:

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

#define SIZE 10

typedef struct {
    char name[20];
    int age;
} Person;

typedef struct {
    Person* data;
    int key;
    int flag;
} HashNode;

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

void insert(HashNode hashTable[], Person* person) {
    int key = hash(person->name);
    
    while (hashTable[key].flag == 1) {
        key = (key + 1) % SIZE;
    }
    
    hashTable[key].data = person;
    hashTable[key].key = key;
    hashTable[key].flag = 1;
}

Person* search(HashNode hashTable[], char* name) {
    int key = hash(name);
    
    while (hashTable[key].flag != 0) {
        if (strcmp(hashTable[key].data->name, name) == 0) {
            return hashTable[key].data;
        }
        
        key = (key + 1) % SIZE;
    }
    
    return NULL;
}

int main() {
    HashNode hashTable[SIZE];
    
    for (int i = 0; i < SIZE; i++) {
        hashTable[i].flag = 0;
    }
    
    Person person1 = {'Alice', 20};
    Person person2 = {'Bob', 25};
    Person person3 = {'Charlie', 30};
    
    insert(hashTable, &person1);
    insert(hashTable, &person2);
    insert(hashTable, &person3);
    
    char name[20];
    printf('Enter a name to search: ');
    scanf('%s', name);
    
    Person* result = search(hashTable, name);
    
    if (result == NULL) {
        printf('Person not found\n');
    }
    else {
        printf('Person found: %s, %d years old\n', result->name, result->age);
    }
    
    return 0;
}

总结

本文介绍了三种常用的查找算法:折半查找、二叉排序树查找和哈希表查找,并提供了C语言代码示例。每种算法都有其优缺点,应根据具体情况选择合适的算法。

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

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

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