diff --git a/codes/c/chapter_searching/CMakeLists.txt b/codes/c/chapter_searching/CMakeLists.txt new file mode 100644 index 000000000..fc82fc7b2 --- /dev/null +++ b/codes/c/chapter_searching/CMakeLists.txt @@ -0,0 +1,2 @@ +add_executable(binary_search binary_search.c) +add_executable(linear_search linear_search.c) \ No newline at end of file diff --git a/codes/c/chapter_searching/binary_search.c b/codes/c/chapter_searching/binary_search.c new file mode 100644 index 000000000..745aa29f4 --- /dev/null +++ b/codes/c/chapter_searching/binary_search.c @@ -0,0 +1,59 @@ +/** + * File: binary_search.c + * Created Time: 2023-03-18 + * Author: Guanngxu (446678850@qq.com) + */ + +#include "../include/include.h" + +/* 二分查找(双闭区间) */ +int binarySearch(int *nums, int len, int target) { + // 初始化双闭区间 [0, n-1] ,即 left, right 分别指向数组首元素、尾元素 + int left = 0, right = len - 1; + // 循环,当搜索区间为空时跳出(当 left > right 时为空) + while (left <= right) { + int mid = (left + right) / 2; // 计算中点索引 mid + if (nums[mid] < target) // 此情况说明 target 在区间 [mid+1, right] 中 + left = mid + 1; + else if (nums[mid] > target) // 此情况说明 target 在区间 [left, mid-1] 中 + right = mid - 1; + else // 找到目标元素,返回其索引 + return mid; + } + // 未找到目标元素,返回 -1 + return -1; +} + +/* 二分查找(左闭右开) */ +int binarySearch1(int *nums, int len, int target) { + // 初始化左闭右开 [0, n) ,即 left, right 分别指向数组首元素、尾元素+1 + int left = 0, right = len; + // 循环,当搜索区间为空时跳出(当 left = right 时为空) + while (left < right) { + int mid = (left + right) / 2; // 计算中点索引 mid + if (nums[mid] < target) // 此情况说明 target 在区间 [mid+1, right) 中 + left = mid + 1; + else if (nums[mid] > target) // 此情况说明 target 在区间 [left, mid) 中 + right = mid; + else // 找到目标元素,返回其索引 + return mid; + } + // 未找到目标元素,返回 -1 + return -1; +} + +/* Driver Code */ +int main() { + int target = 6; + int nums[10] = { 1, 3, 6, 8, 12, 15, 23, 67, 70, 92 }; + + /* 二分查找(双闭区间) */ + int index = binarySearch(nums, 10, target); + printf("目标元素 6 的索引 = %d\n", index); + + /* 二分查找(左闭右开) */ + index = binarySearch1(nums, 10, target); + printf("目标元素 6 的索引 = %d\n", index); + + return 0; +} diff --git a/codes/c/chapter_searching/linear_search.c b/codes/c/chapter_searching/linear_search.c new file mode 100644 index 000000000..3edbe084c --- /dev/null +++ b/codes/c/chapter_searching/linear_search.c @@ -0,0 +1,53 @@ +/** + * File: linear_search.c + * Created Time: 2023-03-19 + * Author: Guanngxu (446678850@qq.com) + */ + +#include "../include/include.h" + +/* 线性查找(数组) */ +int linearSearchArray(int *nums, int len, int target) { + // 遍历数组 + for (int i = 0; i < len; i++) { + // 找到目标元素,返回其索引 + if (nums[i] == target) + return i; + } + // 未找到目标元素,返回 -1 + return -1; +} + +/* 线性查找(链表) */ +ListNode* linearSearchLinkedList(ListNode* head, int target) { + // 遍历链表 + while (head != NULL) { + // 找到目标结点,返回之 + if (head->val == target) + return head; + head = head->next; + } + // 未找到目标结点,返回 NULL + return NULL; +} + +/* Driver Code */ +int main() { + int target = 3; + + /* 在数组中执行线性查找 */ + int nums[10] = { 1, 5, 3, 2, 4, 7, 5, 9, 10, 8 }; + int index = linearSearchArray(nums, 10, target); + printf("目标元素 3 的索引 = %d\n", index); + + /* 在链表中执行线性查找 */ + ListNode* head = arrToLinkedList(nums, 10); + ListNode* node = linearSearchLinkedList(head, target); + if(node == NULL) { + printf("目标结点值 3 的对应结点对象为 NULL\n"); + } else { + printf("目标结点值 3 的对应结点对象为 addr: %p val: %d\n", node, node->val); + } + + return 0; +}