C语言输入任意长度数组后,再在该数组中查找特定的值,并且可查找多个相同的值

例:在a[20] = { 99,42,57,74,46,85,32,78,40,33,74,88,65,27,38,69,51,32,59,24 }中查找32,需要查找到两个32的位置

#include <stdio.h>
#include <malloc.h> void shellSort(int* a, int len); // 函数声明
int binary_search(int a[], int x, int len); int main(void)
{
int i, len, * a, * b;
printf("请输入数组长度:");
scanf_s("%d", &len);
a = (int*)malloc(len * sizeof(int)); // 动态定义数组
b = (int*)malloc(len * sizeof(int)); // 动态定义数组
printf("请输入数组的每个元素:\n");
for (i = 0; i < len; i++) // 数组值的输入
scanf_s("%d", &a[i]);
for (i = 0; i < len; i++)
b[i] = a[i]; //int a[20] = { 99,42,57,74,46,85,32,78,40,33,74,88,65,27,38,69,51,32,59,24 };
//int b[20] = { 99,42,57,74,46,85,32,78,40,33,74,88,65,27,38,69,51,32,59,24 };
shellSort(a, len); // 调用希尔排序函数
printf("希尔升序排列后结果为:\n");
for (i = 0; i < len; i++) // 排序后的结果的输出
printf("%d\t", a[i]); printf("\n"); int ret = 0, * c, n = 0, x;
printf("请输入要查找的数组元素:");
scanf_s("%d", &x);
ret = binary_search(a, x, len);
c = (int*)malloc(ret * sizeof(int)); // 动态定义数组
if (ret != -1)
{
for (i = 0; i < len; i++)
if (b[i] == x)
{
c[n] = i;
n++;
}
printf("数组内元素等于%d的下标为:\n",x);
for (i = 0; i < ret; i++) // 排序后的结果的输出
printf("%d\t", c[i]); } else
printf("查询无果"); return 0;
} //希尔排序
void shellSort(int* a, int len)
{
int i, j, k, tmp, gap; // gap 为步长
for (gap = len / 2; gap > 0; gap /= 2) // 步长初始化为数组长度的一半,每次遍历后步长减半,
for (i = 0; i < gap; ++i) // 变量 i 为每次分组的第一个元素下标
for (j = i + gap; j < len; j += gap) //对步长为gap的元素进行直插排序,当gap为1时,就是直插排序
{
tmp = a[j]; // 备份a[j]的值
k = j - gap; // j初始化为i的前一个元素(与i相差gap长度)
while (k >= 0 && a[k] > tmp)
{
a[k + gap] = a[k]; // 将在a[i]前且比tmp的值大的元素向后移动一位
k -= gap;
}
a[k + gap] = tmp;
}
} //函数实现功能:折半查找数x,若找到返回存在数量,未找到则返回-1
int binary_search(int a[], int x, int len)
{
int left = 0;
int right = len - 1;
int tmp = 0;
int e = 0, f = 0, n = 0;
while (left < right)
{
tmp = (right + left) / 2; //进行每次折半操作
if (x > a[tmp])
left = tmp; if (x < a[tmp])
right = tmp; if (x == a[tmp])
{
int n = 1;
int i = 1;
while (1)
{
if (tmp + i == len)
break;
if (x == a[tmp + i])
{
n++;
i++;
}
else break;
}
i = 1;
while (1)
{
if (tmp - i == - 1)
break;
if (x == a[tmp - i])
{
n++;
i++;
}
else break;
}
return n;
}
//跳出奇异点
if (e == left && f == right)
n++;
if (n == 2)
break;
e = left; f = right;
}
return -1;
}

C语言输入任意长度数组后,再在该数组中查找特定的值,并且可查找多个相同的值的更多相关文章

  1. IO流处理文件读取到字节数组,再从字节数组读取到文件,Java实现

    package cn.zhang.io; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; impo ...

  2. jquery实现对象数组 筛选出每条记录中的特定属性字段 及根据某个属性值筛选出指定的元素

    jquery实现对象数组 筛选出每条记录中的特定属性字段 直接上图: 源码: /** * 对后端返回的数据,筛选出符合报表的列项,多余的列项去除 */ function filterParams(da ...

  3. 用C语言将一个数开根号后再取倒数的方法

    在上学的时候,曾经看过有人写过这样的算法,就是将一个数开根号后再取倒数的算法,我本人也觉得十分巧妙,于是就将它积累了下来,让我们来看看是怎么回事: #include <stdio.h> # ...

  4. C#根据域名查询IP(CMD命令参数输入或者启动程序后再输入查询)

    有时因为需要,希望知道域名的IP,那用C#怎么实现呢?以下是实现代码 using System; using System.Collections.Generic; using System.Linq ...

  5. python多层数组合成一个数组后循环打印出数组内的每一项元素的方法

    a=[1,2,3,4] b=[5,6,7,8] c=[a,b] def test(c): for i in c: return i print(test(c)) 以上代码执行后打印出来的结果是 预期目 ...

  6. go语言怎么从(json后的)多层map中取值

    // 一个PHP中的多层关联数组,即Go中的多层map,如何从json字符串中解析,然后取到map中的某个具体的值. // 数据结构如下: cityInfo := "{ "stat ...

  7. C语言---递归反向输出任意长度的字符串

    (该字符串可以包含空格和回车!) [题目要求] 编写一个递归函数,实现将输入的任意长度的字符串反向输出的功能. 例如输入字符串:ABCD,输出字符串:DCBA. [题目分析] 应用递归的思想有时可以很 ...

  8. Java - 数组详解(图解数组的基本操作)

    目录 什么是数组 数组的定义和内存分配 数组的赋值和访问 数组的注意事项 数组的内存图解 数组的插入 数组的删除 数组的扩容 数组的反转 首先 什么是数组 数组是一组地址连续.长度固定的具有相同类型的 ...

  9. Java练习小题_求一个3*3矩阵对角线元素之和,矩阵的数据用行的形式输入到计算机中 程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。

    要求说明: 题目:求一个3*3矩阵对角线元素之和,矩阵的数据用行的形式输入到计算机中 程序分析:利用双重for循环控制输入二维数组,再将 a[i][i] 累加后输出. 实现思路: [二维数组]相关知识 ...

  10. 页面上有3个输入框:分别为max,min,num;三个按钮:分别为生成,排序,去重;在输入框输入三个数字后,先点击生成按钮,生成一个数组长度为num,值为max到min之间的随机整数点击排序,对当前数组进行排序,点击去重,对当前数组进行去重。 每次点击之后使结果显示在控制台

    <!DOCTYPE html> <html> <head> <!-- 页面上有3个输入框:分别为max,min,num:三个按钮:分别为生成,排序,去重: 在 ...

随机推荐

  1. python入门,一篇就够了

    python规范 函数必须写注释:文档注释格式'''注释内容''' 参数中的等号两边不要用空格 相邻函数用两个空行隔开 小写 + 下划线 函数名 模块名 实例名 驼峰法 类名 tips # 一行代码太 ...

  2. cesium加载gif图片(cesium篇.43)

    https://blog.csdn.net/QQ98281642/article/details/120214325

  3. Wow: 基于 DDD、EventSourcing 的现代响应式 CQRS 架构微服务开发框架

    领域驱动 | 事件驱动 | 测试驱动 | 声明式设计 | 响应式编程 | 命令查询职责分离 | 事件溯源 架构图 事件源 可观测性 OpenAPI (Spring WebFlux 集成) 自动注册 命 ...

  4. 【python笔记】高阶函数map、filter、reduce

    前言 map().reduce().filter()是python的三个高阶函数.所谓高阶函数,指的是将函数作为参数并返回函数作为结果的函数.下面代码的sing_ready只是一个简单高阶函数示例: ...

  5. 状压DP-学习笔记

    状压DP 状压 \(DP\) 是一种基于二进制数的 \(DP\). T1 题目大意 将一个整数 \(N\) 分解成若干个小整数的乘积,满足: 分解出的整数必须来自集合 \(S\). 分解出的整数必须互 ...

  6. Midjourney的一些学习心得:如何高效的图生图

    注意本文没有什么长篇大论,全部是自己的学习心得. 心得体会:如何图生图 今天在一篇midjourney看到好图应该怎么抄. 相信经常会看到好图也想要的,但是要么抄不出感觉,要么抄过来把水印也抄了,这一 ...

  7. 如何通过API接口获取微店的商品详情

    微店是一款电商平台,对于商家而言,了解商品详情数据是非常重要的.通过API接口获取微店的商品详情,可以让商家更加便捷地管理和分析商品数据.下面就让我们详细了解一下如何通过API获取微店的商品详情. 第 ...

  8. Antd Form表单中Input输入框 在IE9下按下任何按键都会报校验失败

    antd Form表单中Input输入框 在IE9下按下任何按键都会报校验失败,导致输入框输入不了任何内容! 可能你的react及react-dom版本由于过高导致antd组件不能兼容,需要对reac ...

  9. docker搭建CMS靶场

    项目地址:https://github.com/Betsy0/CMSVulSource 该项目是为了方便在对CMS漏洞进行复现的时候花费大量的时间在网上搜索漏洞源码,从而有了此项目.此项目仅为安全研究 ...

  10. TOML格式简介

    TOML(Tom's Obvious, Minimal Language)是一种用于配置文件的轻量级文本格式,旨在易于阅读和编写.它的设计目标是简单明了,同时也能表达复杂的数据结构.TOML文件通常用 ...