C语言基础(三十一)

news2024/9/22 21:23:08

1、线性搜索:

#include "date.h"
#include <stdio.h>  
#include <stdlib.h>  
#include <time.h>  
  
// 希尔排序  
void shellSort(int arr[], int n) {  
    for (int gap = n / 2; gap > 0; gap /= 2) {  
        for (int i = gap; i < n; i++) {  
            int temp = arr[i];  
            int j;  
            for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {  
                arr[j] = arr[j - gap];  
            }  
            arr[j] = temp;  
        }  
    }  
}  
  
// 线性搜索并计算相同元素个数,打印序号  
void linearSearchAndCount(int arr[], int n, int target) {  
    int count = 0;  
    printf("Found at indices: ");  
    for (int i = 0; i < n; i++) {  
        if (arr[i] == target) {  
            printf("%d ", i);  
            count++;  
        }  
    }  
    if (count == 0) {  
        printf("Not found.\n");  
    } else {  
        printf("\nTotal occurrences: %d\n", count);  
    }  
}  
  
// 打印数组  
void printArray(int arr[], int n) {  
    for (int i = 0; i < n; i++) {  
        printf("%d ", arr[i]);  
    }  
    printf("\n");  
}  
 
int main() {  
    int times = getTime();
    int n, target;  
    printf("Enter the size of the array: ");  
    scanf("%d", &n);  
  
    int *arr = (int *)malloc(n * sizeof(int));  
    if (arr == NULL) {  
        printf("Memory allocation failed.\n");  
        return 1;  
    }  
  
    srand(time(NULL));  
    for (int i = 0; i < n; i++) {  
        arr[i] = rand() % 100; // 假设生成0到99之间的随机数  
    }  
    printf("Original array: ");  
    printArray(arr, n); // 打印排序前的数组  
  
    shellSort(arr, n);  
  
    printf("Sorted array: ");  
    printArray(arr, n); // 打印排序后的数组  
  
    printf("Enter the target number to search: ");  
    scanf("%d", &target);  
  
    linearSearchAndCount(arr, n, target); // 线性搜索并打印结果  
  
    free(arr);  
    return 0;  
}

运行结果如下:

 

2、二分搜索:

#include "date.h" 
#include <stdio.h>  
#include <stdlib.h>  
#include <time.h>  
  
// 希尔排序  
void shellSort(int arr[], int n) {  
    for (int gap = n / 2; gap > 0; gap /= 2) {  
        for (int i = gap; i < n; i++) {  
            int temp = arr[i];  
            int j;  
            for (j = i; j >= gap && arr[j - gap] > temp; j -= gap)  
                arr[j] = arr[j - gap];  
            arr[j] = temp;  
        }  
    }  
}  
  
// 线性搜索计算相同元素  
int countAndPrintSame(int arr[], int n, int target) {  
    int count = 0;  
    int firstIndex = -1;  
    for (int i = 0; i < n; i++) {  
        if (arr[i] == target) {  
            if (firstIndex == -1) firstIndex = i;  
            count++;  
        }  
    }  
    if (count > 0) {  
        printf("Found %d occurrences of %d, first at index %d.\n", count, target, firstIndex);  
    } else {  
        printf("Element %d not found in the array.\n", target);  
    }  
    return count;  
}  
  
// 二分查找  
int binarySearch(int arr[], int l, int r, int x) {  
    while (l <= r) {  
        int m = l + (r - l) / 2;  
  
        // 检查mid是否是要找的元素  
        if (arr[m] == x) return m;  
  
        // 如果元素小于mid,则它只可能出现在左子数组中  
        if (arr[m] < x)  
            l = m + 1;  
  
        // 否则,元素只能出现在右子数组中  
        else  
            r = m - 1;  
    }  
  
    // 如果到达这里,元素不在数组中  
    return -1;  
}  
  
int main() {  
    int times = getTime();
    int n, target;  
    printf("Enter the number of elements: ");  
    scanf("%d", &n);  
  
    int* arr = (int*)malloc(n * sizeof(int));  
    srand(time(NULL));  
  
    printf("Generated array:\n ");  
    for (int i = 0; i < n; i++) {  
        arr[i] = rand() % 100; // 生成0到99之间的随机数  
        printf("%d ", arr[i]);  
    }  
    printf("\n");  
  
    shellSort(arr, n);  
    printf("Sorted array: \n");  
    for (int i = 0; i < n; i++) {  
        printf("%d ", arr[i]);  
    }  
    printf("\n");  
  
    printf("Enter the element to search: ");  
    scanf("%d", &target);  
  
    int result = binarySearch(arr, 0, n - 1, target);  
    if (result != -1) {  
        printf("Element found at index %d.\n", result);  
        countAndPrintSame(arr, n, target);  
    } else {  
        printf("Element not found.\n");  
    }  
  
    free(arr); 
	 
    return 0;  
}

运行结果如下:

 

3、 插值搜索:

#include "date.h"
#include <stdio.h>  
#include <stdlib.h>  
#include <time.h>  
// 希尔排序对整数数组arr进行排序。
// 通过缩小增量序列(gap)逐渐逼近最终的排序状态。 
void shellSort(int arr[], int n) {  
    for (int gap = n / 2; gap > 0; gap /= 2) {  
        for (int i = gap; i < n; i++) {  
            int temp = arr[i];  
            int j;  
            for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {  
                arr[j] = arr[j - gap];  
            }  
            arr[j] = temp;  
        }  
    }  
}  
// 插值搜索是一种在有序数组中查找特定元素的算法,基于元素值分布的特性来预测目标值可能的位置,从而减少搜索空间。  
int interpolationSearch(int arr[], int n, int x) {  
    int low = 0, high = n - 1;  
    while (low <= high && x >= arr[low] && x <= arr[high]) {  
        if (high == low) {  
            if (arr[low] == x) return low;  
            return -1;  
        }  
  
        int pos = low + (((double)(high - low) / (arr[high] - arr[low])) * (x - arr[low]));  
  
        if (arr[pos] == x) return pos;  
  
        if (arr[pos] < x)  
            low = pos + 1;  
        else  
            high = pos - 1;  
    }  
    return -1;  
}  
  
int main() { 
    int times = getTime(); 
    int n, i, searchValue;  
    printf("Enter the number of elements: ");  
    scanf("%d", &n);  
    // 动态分配内存  
    int *arr = (int*)malloc(n * sizeof(int));  
    if (!arr) {  
        printf("Memory allocation failed\n");  
        return 1;  
    }  
    // 生成随机数并填充数组  
    srand(time(NULL));  
    for (i = 0; i < n; i++) {  
        arr[i] = rand() % 100; 
    }  
    // 打印原始数组
    printf("Original array: ");  
    for (i = 0; i < n; i++) {  
        printf("%d ", arr[i]);  
    }  
    printf("\n");  
     // 对数组进行希尔排序
    shellSort(arr, n);  
     // 打印排序后的数组
    printf("Sorted array: \n");  
    for (i = 0; i < n; i++) {  
        printf("%d ", arr[i]);  
    }  
    printf("\n");  
    
    // 读取要搜索的值并进行插值搜索
    printf("Enter the value to search: \n");  
    scanf("%d", &searchValue);  
    // 插值搜索
    int index = interpolationSearch(arr, n, searchValue); 
	// 遍历数组以计算并打印目标值的所有出现的位置。 
    if (index != -1) {  
        printf("Element found at index %d\n", index);  
    } else {  
        printf("Element not found\n");  
    }  
  
    // 如果搜索一个值,只要找到就打印。 
    // 计算出现次数,需要遍历数组。 
    int count = 0;  
    for (i = 0; i < n; i++) {  
        if (arr[i] == searchValue) {  
            count++;  
            printf("Found %d at index %d\n", searchValue, i);  
        }  
    }  
    printf("Total occurrences of %d: %d\n", searchValue, count);  
  
    free(arr);  
    
    return 0;  
}

运行结果如下:

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2097208.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue学习记录十四:路由(router)学习(五):Vue Router基本原理实现第二种方法

vue学习记录十四&#xff1a;路由&#xff08;router&#xff09;学习&#xff08;四&#xff09;&#xff1a;Vue Router基本原理实现二 一、vueRouter目录结构二、模拟vueRouter目录结构三、index.js文件实现四、install.js文件实现五、创建组件六、解析路由规则七、match实现…

浅谈人工智能之基于anaconda的AutoGen Studio环境搭建

浅谈人工智能之基于anaconda的AutoGen Studio环境搭建 AutoGen Studio 是一个基于 AutoGen 框架的图形用户界面&#xff08;GUI&#xff09;工具。它使开发人员能够更轻松地创建和管理多智能体应用&#xff0c;而无需编写代码。AutoGen Studio 提供了拖放式界面和各种预构建模…

绿色革命:‘众店‘如何重塑零售业并引领消费新潮流

在数字化浪潮的推动下&#xff0c;传统零售业正面临深刻的变革。在这一过程中&#xff0c;绿色积分系统作为一种创新的消费模式&#xff0c;逐渐成为市场的新宠。 一、"众店"平台的迅猛发展 "众店"平台仅用两年时间就实现了跨越式发展&#xff0c;交易额突…

JS基础【双重for循环的实现与应用、打印九九乘法表】

&#x1f680; 个人简介&#xff1a;某大型国企资深软件开发工程师&#xff0c;信息系统项目管理师、CSDN优质创作者、阿里云专家博主、华为云云享专家&#xff0c;分享前端后端相关技术与工作常见问题~ &#x1f49f; 作 者&#xff1a;码喽的自我修养&#x1f970; &#…

springboot+MySQL流浪猫狗疾病预约救治系统-计算机毕设 附源码 13676

springboot流浪猫狗疾病预约救治系统 摘 要 现如今在中国&#xff0c;随着人民生活质量的逐渐提高&#xff0c;以及人民群众消费能力的日渐增长&#xff0c;各种各样的家养小动物&#xff0c;已经逐渐成为人类越来越亲密的生活伴侣。并且&#xff0c;现如今社会竞争及其激烈&am…

钢铁百科:A633D交货状态、A633D对应牌号、A633D力学性能解析

A633D钢板是一种美标低合金高强度结构钢板&#xff0c;也被称为A633GrD钢板&#xff0c;其执行标准为ASTM/A633M。这种钢板以其高屈服强度、良好的韧性、抗腐蚀性和耐疲劳性而著称&#xff0c;广泛应用于建筑、桥梁、船舶、汽车、铁路、重型机械及矿山机械等多个领域。 一、A6…

【CSS】如何写渐变色文字并且有打光效果

效果如上&#xff0c;其实核心除了渐变色文字的设置 background: linear-gradient(270deg, #d2a742 94%, #f6e2a7 25%, #d5ab4a 48%, #f6e2a7 82%, #d1a641 4%);color: #e8bb2c;background-clip: text;color: transparent;还有就是打光效果&#xff0c;原理其实就是两块遮罩&am…

微信小程序知识点(一)

1.条件判断&#xff1a; wx:if&#xff0c;wx:elif&#xff0c;wx:else 和Hidden的区别 wx:if等是动态实现组件的&#xff0c;符合条件&#xff0c;页面上就新增一个组件&#xff0c;不符合&#xff0c;就会在也页面上加载&#xff0c;而Hidden只是控制页面的组件的显示与否&…

C#绘制常用工业控件(仪表盘,流动条,开关等)

目录 1&#xff0c;使用Graphics绘制Toggle。 效果&#xff1a; 测试代码&#xff1a; Toggle控件代码&#xff1a; 2&#xff0c;使用Graphics绘制Switch。 效果&#xff1a; 测试代码&#xff1a; Switch控件代码&#xff1a; 3&#xff0c;使用Graphics绘制PanelHe…

【Nest 学习笔记】AOP切片编程

切片编程 AOP 把通用逻辑抽离出来&#xff0c;通过切面的方式添加到某个地方&#xff0c;可以复用和动态增删切面逻辑。 中间件 Middleware Middleware 中间件属于全局中间件&#xff08;Middleware 是 Express 的概念&#xff09; 常用于对请求接口进行日志记录 // main.ts …

七. 部署YOLOv8检测器-load-save-tensor

目录 前言0. 简述1. 案例运行2. 补充说明3. 代码分析3.1 main.cpp3.2 create_data.py 结语下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习课程第六章—部署分类器&…

GMeLLo:结合知识图谱的 LLM 多跳问答技术,效果显著提升

1. GMeLLo 提出的背景 1.1 多跳问答 多跳问答的难度往往比较大&#xff0c;因为不仅要追溯事实&#xff0c;还要聚合与串联事实。 事实的来源可以是知识图谱、表格、自由格式文本&#xff0c;或者是这些来源的异构组合。 随着大型语言模型的发展&#xff0c;基于提示的方法…

安科瑞ACR10R网络电力仪表 CE认证 带外置互感器

产品概述&#xff1a; ‌‌安科瑞ACR10R网络电力仪表是一种集成了多种电力参数测量、电能计量、电能监测和考核管理等多种功能于一体的电力仪表。它适用于冶炼、钢铁、电焊、半导体等高能耗行业的节能改造工程&#xff0c;同时也适用于分布式光伏并网柜的功率监测、电力需求侧…

sqli-labs靶场通关攻略 56-60

主页有sqli-labs靶场通关攻略 1-55 第五六关 less-56 步骤一&#xff1a;闭合方式&#xff1a;?id1)-- 步骤二&#xff1a;查询数据库 ?id-1) union select 1,2,database() -- 步骤三&#xff1a;联合查询 查出网站的数据库表名 ?id-1) union select 1,2,group_concat(t…

探索AntSKPro AI知识库一体机:离线智能的便捷之选

在数字化时代&#xff0c;信息的获取和处理速度是企业和个人效率的关键。然而&#xff0c;网络连接的不稳定性常常成为阻碍。AntSKPro AI知识库一体机&#xff0c;一款专为离线环境设计的智能设备&#xff0c;以其卓越的性能和用户友好的设计&#xff0c;正在重新定义离线AI解决…

双指针--优选算法

个人主页&#xff1a;敲上瘾-CSDN博客 个人专栏&#xff1a;游戏、数据结构、c语言基础、c学习、OJ题 前言&#xff1a; 该篇文章我们主要来学习的是双指针算法&#xff0c;对于该类算法我们可以直接来做题&#xff0c;从题中去感知该算法的魅力&#xff0c;最后再从题中做总…

【数据结构】—— 线性表

目录 前言一、顺序表1.1 顺序表的定义及其特点1.2 顺序表的C语言实现1.2.1 定义顺序表1.2.2 初始化1.2.3 插入1.2.4 删除1.2.5 查找 二、链表2.1 链表的定义2.2 单向链表的实现2.2.1 定义单向链表2.2.2 创建链表2.2.3 插入元素2.2.4 删除元素2.2.5 查找 2.3 双向循环链表 前言 …

选刊风向标!985大学近十年发文热门IEEE期刊盘点

本期盘点同济大学近十年有关IEEE旗下发文较多的期刊&#xff0c;一起来看看哪些是双一流大学热门发文期刊&#xff1a; 1、IEEE Transactions on Cybernetics • 影响因子&#xff1a;9.4 • JCR1区&#xff0c;中科院1区-Top • 检索数据库&#xff1a;SCIE • 期刊分区&a…

stable diffusion的安装

stable diffusion的安装 一、前言二、安装python环境1、已经安装python环境&#xff0c;但非3.10.6版本&#xff08;可以不看&#xff09; 三、安装stable diffusion四、运行五、启动报错1、Torch is not able to use GPU2、Installing open_clip 卡住3、报错提示 "git&qu…

systemverilog中的DPI-C用例介绍

文章目录 前言一、dpi_longint二、dpi_packed_array三、dpi_structure四、相关参考总结 前言 本文主要基于VCS内置的三个关于DPI-C的使用用例&#xff0c;记录一下DPI-C的使用方法。测试用例的路径为$VCS_HOME/doc/examples/testbench/sv/。测试用例包括&#xff1a;dpi_longi…