第七周7.2搜索 课堂学习记录 搜索例子+选择排序+二分搜索《程序设计入门——C语言》第七期 浙江大学 翁恺
2019-03-28 20:17
225 查看
1.搜索例子:
[code]#include<iostream> using namespace std; /* 美金币值对应的票面名称,给出币值求票面名称 1, 5, 10, 25, 50 "penny","nickel","dime","quarter","half-dollar" */ int search(int key, int arr[], int length) { int i; int ret = -1; for (i = 0; i < length; i++) { if (key == arr[i]) { ret = i; } } return ret; } int main(){ int key = 26; int a[] = { 1,5,10,25,50 }; char *name[] = { "penny","nickel","dime","quarter","half-dollar" }; int j = search(key, a, sizeof(a) / sizeof(a[0])); if ( j > -1 ) { printf("%s", name[j]); } else { printf("不存在此面币对应的票面名称!"); } printf("\n"); system("pause"); return 0; }
由于分为两个数组存储对cache不友好,故而用结构体对存储结构进行改进(还可以用哈希表)
[code]int a[] = { 1,5,10,25,50 }; //分为两个数组存储对cache不友好 char *name[] = { "penny","nickel","dime","quarter","half-dollar" };
改进后:
[code]#include<iostream> using namespace std; /* 美金币值对应的票面名称,给出币值求票面名称 1, 5, 10, 25, 50 "penny","nickel","dime","quarter","half-dollar" */ struct { //用结构体数组存储对cache更友好 int a; char *name; } coins[] = { {1,"penny"}, {5,"nickel"}, {10,"dime"}, {25,"quarter"}, {50,"half-dollar" } }; int main(){ int key = 25; //要搜索的币值 int a[] = { 1,5,10,25,50 }; //分为两个数组存储对cache不友好 char *name[] = { "penny","nickel","dime","quarter","half-dollar" }; int i; for (i = 0; i < sizeof(coins) / sizeof(coins[0]); i++) { if (key == coins[i].a) { printf("%s", coins[i].name); break; } } printf("\n"); system("pause"); return 0; }
2.选择排序+二分搜索:
二分搜索(英语:binary search),也称折半搜索(英语:half-interval search)、对数搜索(英语:logarithmic search) 。
[code]#include<iostream> using namespace std; /*选择排序数组中的数据+二分搜索*/ //二分搜索 int binary_search(int key, int a[], int length); //求数组中的数据的最大值 int max(int a[], int length); int main(){ int a[] = { 5,1,6,2,48,16,95,42,53,10,42,39 }; int len = sizeof(a) / sizeof(a[0]); //选择排序 for (int i = len - 1; i > 0; i--) { int maxid = max(a, i + 1); //swap a[maxid],a[len-1] int t = a[maxid]; a[maxid] = a[i]; a[i] = t; } //输出排序后的数据顺序 for (int i = 0; i < len; i++) { printf("%d ", a[i]); } printf("\n"); //开始二分搜索 int k; printf("输入想搜索的数据:"); scanf("%d", &k); int ret = binary_search(k, a, len); if (ret > -1) { printf("%d", ret); } else { printf("不存在%d", k); } printf("\n"); system("pause"); return 0; } //二分搜索 int binary_search(int key, int a[], int length) { int ret = -1; int left = 0; int right = length - 1; while (left <= right) { int mid = (left + right) / 2; if (a[mid] == key) { ret = mid; break; } else if (a[mid] > key) { right = mid - 1; } else { left = mid + 1; } } return ret; } //求数组中的数据的最大值 int max(int a[], int length) { int maxid = 0; int i; for (i = 1; i < length; i++) { if (a[i] > a[maxid]) { maxid = i; } } return maxid; }
相关文章推荐
- 第八周指针与字符串编程练习/课堂作业 单词长度+GPS数据处理《程序设计入门——C语言》第七期 浙江大学 翁恺
- 第七周判断与循环编程练习/课堂作业 多项式加法+鞍点《程序设计入门——C语言》第七期 浙江大学 翁恺
- 牛客网算法学习记录-二分搜索
- Fence Rails USACO 4.1(继续阵亡,DFSID+二分搜索+剩余记录)
- 【Jquery】前端学习记录(2)【身份证、左侧导航、模糊搜索】
- TensorFlow学习记录-- 6.百度warp-ctc 参数以及测试例子2解释
- MOSS Search学习记录(二):配置爬网并尝试一个简单的搜索
- MOSS Search学习记录(三):配置搜索范围
- ACM学习记录--二分
- MOSS Search学习记录(七):高级搜索定制(上)
- MOSS Search学习记录(九):高级搜索定制(下)1
- CS231n第七课:卷积神经网络学习记录
- MOSS Search学习记录(四):利用规则搜索指定文件夹的内容
- zigbee 学习记录之一:资料搜索
- MOSS Search学习记录(五):利用元数据和规则搜索多个列表中指定范围的内容
- MOSS Search学习记录(八):高级搜索定制(中)
- MOSS Search学习记录(五):利用元数据和规则搜索多个列表中指定范围的内容
- 学习opengl (es, glsl) 记录搜索项,链接
- MOSS Search学习记录(二):配置爬网并尝试一个简单的搜索
- MOSS Search学习记录(五):利用元数据和规则搜索多个列表中指定范围的内容