C语言查找算法
/**
查找(数组)
1> 顺序查找 : 就是遍历数组每一个元素同该元素比较,但是问题是效率比较低
2> 折半查找 : 条件是数组必须是有顺序的
*/
#include <stdio.h>
#define n 2
int main()
{
// 折半查找
/*
思路:将该元素同中间元素比较,如果有则存在,否则,判断该元素在哪半部分,继续查找;
*/
// 任意输入整数x,在有顺序的数组中查找是否有同x值相同的元素
// 定义输入数据
int x = -1;
// 数组array
int array[10] = {2, 10, 19, 22, 34, 36, 55, 67, 76, 88};
scanf("%d", &x);
// 定义开始元素下标start, 尾标end, 中间元素下标mid
int start = 0;
int end = 9;
int mid = (start + end)/2;
while (array[mid] != x && (end > start)){
if (x < array[mid]) {
end = mid - 1;
}else{
start = mid + 1;
}
mid = (start + end)/2;
}
printf("%d\n", mid);
return 0;
}
#include <stdio.h>
#pragma mark 折半查找 前提是该数组为顺序数组,同时折半查找还能用于插入有序数组中得位置,
#pragma mark 当然我们也可以用for循环查找元素,但是效率较低,当面对大量数据有序数据是,折半查找效率比较高
#pragma mark 如果我们面对一些无须的数据时,如果查找一组数据中是否含有某个数据时,可以先排序,然后用折半查找该元素
#pragma mark 折半查找
int zheban_array(int *array, int len, int num)
{
int start = 0;
int end = len-1;
// 循环的条件
while (start<=end) {
int mid =(start+end)/2;
if (array[mid]<num) {
start = mid+1;
}else if(array[mid]>num){
end = mid-1;
}else{
return mid; // 如果是查找插入元素的话 mid+1就是要插入的位置(查找到存在的插入的元素)
}
// mid = (start+end)/2;
}
return -1; //如果查找的话,return start 就是要插入的位置(查找插入的不存在的元素)
}
#pragma mark 遍历数组
void printf_array(int *array, int len){
for (int i = 0; i<len; i++) {
printf("%d\t", array[i]);
}
printf("\n");
}
int main()
{
int array[] = {3, 5, 8, 23, 34, 65, 99};
int len = sizeof(array)/sizeof(int);
int n = zheban_array(array, len, 34);
printf("%d\n", n);
return 0;
}