第七周7.2搜索 课堂学习记录 搜索例子+选择排序+二分搜索《程序设计入门——C语言》第七期 浙江大学 翁恺

2023-11-20

1.搜索例子:

#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不友好,故而用结构体对存储结构进行改进(还可以用哈希表)

int a[] = { 1,5,10,25,50 };		//分为两个数组存储对cache不友好
char *name[] = { "penny","nickel","dime","quarter","half-dollar" };

改进后:

#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) 。

#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;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第七周7.2搜索 课堂学习记录 搜索例子+选择排序+二分搜索《程序设计入门——C语言》第七期 浙江大学 翁恺 的相关文章

  • 【C语言取反运算符】~2是多少?~-5是多少?

    标题的答案 2 3 3 2 原理是什么 我们先来看这个程序及输出的结果 容易总结出这样一个结论 i i 1 为什么呢 一言以蔽之 运算符是对i的补码 含符号位 进行取反 2的原码是0000 0010 正数补码是其本身0000 0010 取反
  • 【C++学习笔记(五十一)】之Qt中的信号和槽机制

    一 信号和槽机制 信号和槽机制分为信号和槽函数 用于处理事件 当某个事件发生时 比如说某个按钮被点击后 它就会发出一个信号 signal 如果有对象对这个信号感兴趣 那么它就会使用连接 connect 函数 将该信号与自己的一个槽函数 sl
  • c++学习笔记-----this指针、构造函数、析构函数和友元函数

    一 this指针 1 概念理解 说起this指针 我个人的理解就是假如我们生产了同一种型号的两个杯子 当张三要买的时候 我们就用一个工具 this指针 给该杯子底部刻上张三的名字用来识别是张三 当李四要买 我们就给杯子刻上李四的名字 这样虽
  • 二维数组定义

    二维数组定义 1 方法一 int a new int m for int i 0 i
  • C++利用zxing识别二维码

    C 利用zxing识别二维码 下载编译 配置使用 Win10 x64 VS2015 VS2019 下载编译 1 下载zxing包 并解压 下载地址 https github com glassechidna zxing cpp build文
  • C\C++各种变量存放区域(代码、数据、堆、栈)

    C C 各种变量存放区域 代码 数据 堆 栈 文章目录 C C 各种变量存放区域 代码 数据 堆 栈 变量 数据 变量 数据存放区域 练习 请说明下面的指针分别指向什么位置 BSS Block Started by Symbol 区 为什么
  • C++——初始化列表

    初始化列表 在构造函数执行时 先执行初始化列表 实现变量的初始化 然后再执行函数内部的语句 构造函数体赋值 在创建对象时 编译器通过调用构造函数 给对象中各个成员变量一个合适的初始值 class Date public Date int y
  • 03C++核心编程——黑马程序员

    C 核心编程 本阶段主要针对C 面向对象编程技术做详细讲解 探讨C 中的核心和精髓 1 内存分区模型 C 程序在执行时 将内存大方向划分为4个区域 代码区 存放函数体的二进制代码 由操作系统进行管理的 全局区 存放全局变量和静态变量以及常量
  • 苏小红版 c语言程序设计(第三版)系列实验题:学生成绩管理系统V6.0

    github https github com Jackie0Feng SAMS 系统需求描述 某班有最多不超过30人 具体人数由键盘输入 参加期末考试 考试科目最多不超过6门 具体门数由键盘输入 学生成绩管理系统是一个非常实用的程序 如果
  • C++对象调用优化

    C 对象调用优化 临时对象拷贝构造新对象 临时对象就不会产生 常见的对象调用过程 c 编译器对于对象构造的优化 用临时对象拷贝新对象的时候 临时对象就不产生了 直接构造新对象就可以了 include
  • 【无标题】C++课程学习笔记(南科大于仕琪老师)

    这几天我突然想写CSDN了 前段时间我打开了我的CSDN 发现我其实只写了3篇文章 其实写CSDN是一个好习惯 我之前这么多年都没有发现这个好习惯 现在我要求自己只有有所心得就应该写下来 一方面与大家共勉 另一方面通过和大家的交流我希望自己
  • C++ vector容器-44-vector插入和删除以及存取

    本篇继续学习vector容器 前面学习了vector是一个单端数组 也就是说vector的插入和删除 基本上都是在数组的末端进行 本篇要学习的vector插入和删除的方法就能体现这个特点 最后学习vector的存取操作 1 vector的插
  • Windows中使用GCC介绍

    Windows中使用GCC介绍 GCC介绍 GCC是由许多组件组成的 GCC原名为GNU C语言编译器 GNU C Compiler 只能处理C语言 但其很快扩展 变得可处理C 后来又扩展为能够支持更多编程语言 如Fortran Pasca
  • C#访问SQLite数据库,实现数据的增删改查功能

    说明 本文的代码是基于Winform中举例的 经过实测可用 1 封装Sqlite操作类 sqLiteHelper using System using System Collections Generic using System Linq
  • c++---优先队列(priority_queue)

    C 中的优先队列是STL中的派生容器 它仅考虑最高优先级元素 队列遵循FIFO策略 而优先队列根据优先级弹出元素 即 优先级最高的元素首先弹出 与普通队列区别 在优先队列中 队列中的每个元素都与某个优先级相关联 但是优先级在队列数据结构中不
  • C++泛型编程

    C 泛型编程 1 泛型编程 1 1 模板 1 2 函数模板 1 2 1 语法 1 2 2 使用函数模板方式 1 2 3 普通函数和函数模板的区别 1 2 4 普通函数与函数模板的调用规则 1 2 5 模板的局限性 1 3 类模板 1 3 1
  • C++Static成员

    Static成员 概念 声明为static的类成员称为类的静态成员 用static修饰的成员变量 称之为静态成员变量 用static修饰的成员函数 称之为静态成员函数 静态成员变量一定要在类外进行初始化 例题 实现一个类 计算程序中创建了多
  • c++类模板与继承详解

    c 类模板 继承 详解 类模板和类模板之间 类模板和类之间可以互相继承 它们之间的派生关系有以下四种情况 1 类模板继承类模板 2 类模板继承模板类 3 类模板继承普通类 4 普通类继承模板类 include
  • C++程序的基本组成简介

    C 程序的基本组成简介 C 程序的基本组成 这个C 程序例子 由一个程序单位 程序文件 注 组成 这是一个简单例子未使用类 注 其中包括 1 头文件 可以认为头文件是你在调用函数时的一个桥梁 格式为 include 引用文件名 c 的程序是
  • C++学习笔记(十六):对vector进行更多的操作——泛型算法

    先强调一下 这里的泛型算法实际不光光是对vector的操作 对于 顺序容器 均可以 但是什么是顺序容器 我们都知道 容器就是一些特定类型对象的集合 而顺序容器为程序员提供了控制元素存储和访问的能力 这种容器的一个显著的特征 就是容器中元素的

随机推荐