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. 解读 --- Span<T>

    引言 Span<T> 是C# 中的一种结构体,它是一种内存安全的类型,可以用来表示连续的内存区域.Span<T> 可以被用于访问和操作数组.堆上分配的内存和栈上分配的内存.使用 ...

  2. 产品代码都给你看了,可别再说不会DDD(一):DDD入门

    这是一个讲解DDD落地的文章系列,作者是<实现领域驱动设计>的译者滕云.本文章系列以一个真实的并已成功上线的软件项目--码如云(https://www.mryqr.com)为例,系统性地讲 ...

  3. qBittorrent如何运行脚本 BT实现自动改名并方便Jellyfin的搜刮器

    qBittorrent如何运行脚本 BT实现自动改名并方便Jellyfin的搜刮器 很多影视网站下载的视频名字大概是为了规避监测,命名非常奇葩,比如:z灼f流,y骨y等等.如果你使用了Jellyfin ...

  4. 给微软.Net runtime运行时提交的几个Issues

    前言 因为目前从事的CLR+JIT,所以会遇到一些非常底层的问题,比如涉及到微软的公共运行时和即时编译器或者AOT编译器的编译异常等情况,这里分享下自己提的几个Issues. Issues 一.iss ...

  5. Django项目缓存优化

    一.为什么要使用缓存 大家可以想一下Django的请求响应流程: → 用户浏览器输入URL地址 → Web服务器将HTTP请求转发给uWSGI服务器 → uWSGI服务器将Request请求转发给Dj ...

  6. DP模拟题

    Smiling & Weeping ----寒灯纸上,梨花雨凉,我等风雪又一年 # [NOIP2007 普及组] 守望者的逃离 ## 题目背景 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深 ...

  7. Django-rest-framework框架——Web应用模式、API接口、接口测试工具(Postman)、RESTfulAPI规范、序列化、drf、环境安装与配置、CBV源码分析、 APIView

    @ 目录 一 Web应用模式 1.1 前后端不分离 1.2 前后端分离 二 API接口 三 接口测试工具:Postman 四 RESTful API规范(背诵牢记) 4.1 数据的安全保障 4.2 接 ...

  8. 第五周单元测验题英语教学与互联网 mooc

    第五周单元测验题 返回 本次得分为:16.00/20.00, 本次测试的提交时间为:2020-08-30, 如果你认为本次测试成绩不理想,你可以选择 再做一次 . 1 单选(2分) 从评价的主体来看, ...

  9. 在 Linux 环境(Ubuntu)下安装 Slurm 和 OpenMPI

    安装 Slurm 从软件源安装 slurm-wlm(每个节点都需要装的执行工具).slurm-client(客户机装的提交命令的工具).munge(节点间通信插件) sudo apt install ...

  10. Graph RAG: 知识图谱结合 LLM 的检索增强

    本文为大家揭示 NebulaGraph 率先提出的 Graph RAG 方法,这种结合知识图谱.图数据库作为大模型结合私有知识系统的最新技术栈,是 LLM+ 系列的第三篇,加上之前的图上下文学习.Te ...