forked from krahets/hello-algo
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add C binary_search and linear_search (krahets#426)
* add C binary_search * add C linear_search * Update linear_search.c * Update binary_search.c --------- Co-authored-by: Yudong Jin <[email protected]>
- Loading branch information
Showing
3 changed files
with
114 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
add_executable(binary_search binary_search.c) | ||
add_executable(linear_search linear_search.c) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
/** | ||
* File: binary_search.c | ||
* Created Time: 2023-03-18 | ||
* Author: Guanngxu ([email protected]) | ||
*/ | ||
|
||
#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; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
/** | ||
* File: linear_search.c | ||
* Created Time: 2023-03-19 | ||
* Author: Guanngxu ([email protected]) | ||
*/ | ||
|
||
#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; | ||
} |