C语言输入任意长度数组后,再在该数组中查找特定的值,并且可查找多个相同的值
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语言输入任意长度数组后,再在该数组中查找特定的值,并且可查找多个相同的值的更多相关文章
- IO流处理文件读取到字节数组,再从字节数组读取到文件,Java实现
package cn.zhang.io; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; impo ...
- jquery实现对象数组 筛选出每条记录中的特定属性字段 及根据某个属性值筛选出指定的元素
jquery实现对象数组 筛选出每条记录中的特定属性字段 直接上图: 源码: /** * 对后端返回的数据,筛选出符合报表的列项,多余的列项去除 */ function filterParams(da ...
- 用C语言将一个数开根号后再取倒数的方法
在上学的时候,曾经看过有人写过这样的算法,就是将一个数开根号后再取倒数的算法,我本人也觉得十分巧妙,于是就将它积累了下来,让我们来看看是怎么回事: #include <stdio.h> # ...
- C#根据域名查询IP(CMD命令参数输入或者启动程序后再输入查询)
有时因为需要,希望知道域名的IP,那用C#怎么实现呢?以下是实现代码 using System; using System.Collections.Generic; using System.Linq ...
- 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)) 以上代码执行后打印出来的结果是 预期目 ...
- go语言怎么从(json后的)多层map中取值
// 一个PHP中的多层关联数组,即Go中的多层map,如何从json字符串中解析,然后取到map中的某个具体的值. // 数据结构如下: cityInfo := "{ "stat ...
- C语言---递归反向输出任意长度的字符串
(该字符串可以包含空格和回车!) [题目要求] 编写一个递归函数,实现将输入的任意长度的字符串反向输出的功能. 例如输入字符串:ABCD,输出字符串:DCBA. [题目分析] 应用递归的思想有时可以很 ...
- Java - 数组详解(图解数组的基本操作)
目录 什么是数组 数组的定义和内存分配 数组的赋值和访问 数组的注意事项 数组的内存图解 数组的插入 数组的删除 数组的扩容 数组的反转 首先 什么是数组 数组是一组地址连续.长度固定的具有相同类型的 ...
- Java练习小题_求一个3*3矩阵对角线元素之和,矩阵的数据用行的形式输入到计算机中 程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。
要求说明: 题目:求一个3*3矩阵对角线元素之和,矩阵的数据用行的形式输入到计算机中 程序分析:利用双重for循环控制输入二维数组,再将 a[i][i] 累加后输出. 实现思路: [二维数组]相关知识 ...
- 页面上有3个输入框:分别为max,min,num;三个按钮:分别为生成,排序,去重;在输入框输入三个数字后,先点击生成按钮,生成一个数组长度为num,值为max到min之间的随机整数点击排序,对当前数组进行排序,点击去重,对当前数组进行去重。 每次点击之后使结果显示在控制台
<!DOCTYPE html> <html> <head> <!-- 页面上有3个输入框:分别为max,min,num:三个按钮:分别为生成,排序,去重: 在 ...
随机推荐
- 【笔记】- 【美团1万台 Hadoop 集群 YARN 的调优之路】
原文:美团1万台 Hadoop 集群 YARN 的调优之路 背景 架构 YARN架构 资源抽象 YARN调度架构 资源抽象 调度流程 作业的组织方式 核心调度流程 指标 业务指标:有效调度 系统性能指 ...
- 修改启动配置文件更改root密码
第二种:修改启动配置文件 (1)进入救援模式 开机选择第一个系统内核,键入e (2)修改配置文件 将光标移动linux 开始的行,添加内核参数 rd.break 按ctrl-x启动 光标放在linux ...
- MindSponge分子动力学模拟——软件架构(2023.08)
技术背景 在前面一篇文章中,我们介绍了MindSponge的两种不同的安装与使用方法,让大家能够上手使用.这篇文章主要讲解MindSponge的软件架构,并且协同mindscience仓库讲解一下二者 ...
- 【Java监控】使用SkyWalking监控Java服务
你的Java服务是如何监控的呢? 1.Null:监控?什么监控?我一个写代码的服务挂了跟我有什么关系? 2.命令行:服务挂了?内存泄漏?jstat jmap jcmd,还好不是我写的 3.撸代码:Ja ...
- 《SQL与数据库基础》22. 分库分表(二)
目录 分库分表(二) MyCat分片规则 范围分片 取模分片 一致性hash分片 枚举分片 应用指定算法 固定分片hash算法 字符串hash解析 按天分片 自然月分片 MyCat原理 MyCat管理 ...
- Jenkins 相关配置
https://www.cnblogs.com/zylyehuo/ 参考链接 解决:Jenkins: signature verification failed in update site 'def ...
- LeetCode297:hard级别中最简单的存在,java版,用时击败98%,内存击败百分之九十九
本篇概览 因为欣宸个人水平有限,在刷题时一直不敢面对hard级别的题目,生怕出现一杯茶一包烟,一道hard做一天的窘境 这种恐惧心理一直在,直到遇见了它:LeetCode297,建议不敢做hard题的 ...
- Jenkins持续集成入门到精通(进阶篇)
视频参考:https://www.bilibili.com/video/BV1Vp4y1b7ZN?p=51 1. Jenkins+Docker+SpringCloud持续集成流程说明 大致流程说明: ...
- redis基本数据类型 List
127.0.0.1:6379> LPUSH test a (integer) 1 127.0.0.1:6379> LPUSH test b (integer) 2 127.0.0.1:63 ...
- c语言代码练习3
//查看数字是否存在于数组中#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { int i = 0; int ...