1、自行输入数组元素后,数组元素会自动按照升序排序;
2、输入所需搜索的数组元素,即可查看查找数组元素于数组中的下标位及个数;
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//测试数组
//int arr[] = { 1,2,3,7,7,7,7,7,7,7 };
//int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr[10];
int rt = 0;//数组元素下标位
int i = 0;
int n = 0;
int Basic(int mid);
int Optimize_left(int i);
int Optimize_right(int i);
void Sort();
int main()
{
Sort();//将数组中元素按升序排序
int c = 0;//用于截取Basic()函数中数组读取的个数
printf("***************************************\n");
printf("请输入您所需查询的元素:");
scanf("%d", &n);
printf("***************************************\n");
i = Basic(rt);
//printf("元素下标位:%d\n",i);
if (i != 0)
{
c = 1;
int optimize_left = Optimize_left(i);
printf("sum_left:%d\n", optimize_left);
int optimize_right = Optimize_right(i);
printf("sum_right:%d\n", optimize_right);
int sum = optimize_left + optimize_right + c;
printf("共存在:%d", sum);
printf("位\n");
}
else
{
c = 0;
printf("共存在:%d", c);
printf("位");
}
}
int Basic(int mid)
{
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;//左下标
int right = sz - 1;//右下标
int k = n;
while (left <= right)
{
int mid = (right + left) / 2;//int整型直接取小数前部分,后部分直接省略
if (arr[mid] > k)
{
right = mid - 1;
}
else if (arr[mid] < k)
{
left = mid + 1;
}
else
{
printf("HAVE FOUND_元素下标位:%d\n", mid);
rt = mid;
//使首位+1,方便主函数计算个数
if (rt == 0)
{
rt = rt + 1;
return rt;
}
else
{
return rt;
}
break;
}
}
if (left > right)
{
printf("NO FOUND\n");
return 0;
}
//return 0;
}
int Optimize_left(int i)
{
int k = n;
int q = 0;
int JiShu1 = 0;
//向左查询
q = i;
if (q != 0)
{
while (k == arr[i])
{
i = i - 1;
if (k == arr[i])
{
printf("HAVE FOUND_left_元素下标位:%d\n", i);
JiShu1 = JiShu1 + 1;
}
else
{
i++;//因while循环最终一次判断需在减一次
if (q != i)
{
break;
}
else
{
printf("左边暂无数据\n");
break;
}
}
}
return JiShu1;
}
else
{
return 0;
}
}
int Optimize_right(int i)
{
int k = n;
int q = 0;
int JiShu2 = 0;
//向右查询
q = i;
if (q != 0)
{
while (k == arr[i])
{
i = i + 1;
if (k == arr[i])
{
printf("HAVE FOUND_right_元素下标位:%d\n", i);
JiShu2 = JiShu2 + 1;
}
else
{
i--;//因while循环最终一次判断需在加一次
if (q != i)
{
break;
}
else
{
printf("右边暂无数据\n");
break;
}
}
}
return JiShu2;
}
else
{
return 0;
}
}
void Sort()
{
int t = 0;//数组元素下标
//int arr[10];
int num = 0;//新元素
int num2 = 0;//上一个录入数组的元素
int o = 0;
int n = 0;
for (int a = 1; a < 11; a++)
{
int q = 0;//用于比较前后两位元素的大小
printf("请依次向数组中存入数字:");
scanf("%d", &num);
if (num2 <= num)
{
arr[t] = num;
t = t + 1;
num2 = num;
}
else if (num2 > num)
{
arr[t] = num;
int i = 1;
int g = 0;
while (q < arr[t - i])
{
//前后两个元素交换位置
o = arr[t - g];
n = arr[t - i];
arr[t - g] = n;
arr[t - i] = o;
i++;
g++;
num2 = arr[t];
q = o;
}
t++;
}
}
//显示数组
/***************
for (int i = 0; i < 10; i++)
{
printf("%d\n", arr[i]);
}
return 0;
****************/
printf("*******已排序*******\n");
}
/*
Create by StarPrayers
Ps:
1、修复了1.0版本中查询首位(个数最小位)显示个数为0的问题
2、增加了可手动输入数组元素的功能
3、增加了输入数组元素后,元素自动按升序排序功能
4、代码可能存在一定冗余性,目前本人处于初始学习阶段,如有不足,欢迎及感谢您的指出
*/