查找
查找:在一些数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程。
列表查找(线性表查找):从列表中查找指定元素
- 输入:列表、待查找元素
- 输出:元素下标(未找到元素时一般返回EOF或-1)
顺序查找(Linear Search)
顺序查找:也叫线性查找,从列表第一个元素开始,顺序进行搜索,直到找到元素或搜索到列表最后一个元素为止。
时间复杂度:O(n)
#include<stdio.h> int linear_search(int li[], int n, int val) { int i = 0; for (i = 0; i < n; i++) { if (li[i] == val) { return i; } } return EOF; } int main() { int li[] = { 1,2,3,5,5,6,7,8,9 }; int n = sizeof(li) / sizeof(li[0]); int index = 0;//下标 index = linear_search(li, n, 6); printf("%d\n", index); index = linear_search(li, n, 4); printf("%d\n", index); return 0; }
二分查找(Binary Search)
二分查找:又叫折半查找,从有序列表的初始候选区li[0:n]开始,通过对待查找的值与候选区中间值进行比较,可以使候选区减少一半。
时间复杂度:O(logn)
#include<stdio.h> int binary_search(int li[], int n, int val) { int left = 0; int right = n - 1; while (left <= right) //候选区有值 { int mid = (left + right) / 2; if (li[mid] == val) { return mid; } else if (li[mid] > val) //待查找的值在mid左侧 { right = mid - 1; } else //待查找的值在mid右侧 { left = mid + 1; } } return EOF; } int main() { int li[] = { 1,2,3,4,5,6,8,8,9 }; int n = sizeof(li) / sizeof(li[0]); int index = 0; index = binary_search(li, n, 3); printf("%d\n", index); index = binary_search(li, n, 7); printf("%d\n", index); return 0; }