使用C语言实现数组中数字的查询与定位(2.0)

        1、自行输入数组元素后,数组元素会自动按照升序排序;

        2、输入所需搜索的数组元素,即可查看查找数组元素于数组中的下标位及个数;

#define _CRT_SECURE_NO_WARNINGS
#include 
//测试数组
//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、代码可能存在一定冗余性,目前本人处于初始学习阶段,如有不足,欢迎及感谢您的指出
*/

你可能感兴趣的:(c语言,算法,数据结构)