C语言进阶之旅 (刷题篇)一数列中插入一个数并保持正序

文章目录

方法1

思路

插入数,和首元素和尾元素判断,选择查找的入口,如果比最大的元素大直接插入在尾元素后面,如果比第一个元素少就遍历整个数组,找到插入的位置

在这里插入图片描述

查找
在这里插入图片描述

#define size 50
#include<stdlib.h>
#include<stdio.h>

int compar(const void*p1,const void*p2)
{
    
    
	return (*(int*)p1) - (*(int*)p2);
}
void Min(int *arr,int j,int n,int k)
{
    
    
	int* frist = arr+k;//首元素
	int* second = frist;
	int* right = arr + n - 1;
	while (*frist > j && right >= frist)
	{
    
    
			*(right + 1) = *right;
			right--;
	}
	*frist = j;
}
int main()
{
    
    
	int arr[size];
	int n;
	int i = 0;
	int j = 0;
	int k = 0;
	scanf("%d", &n);

	//int sz = sizeof(arr) / sizeof(arr[0]);

	for ( i = 0; i < n; i++)
	{
    
    
		scanf("%d", &arr[i]);
	}
	
	qsort(arr, n, sizeof(arr[0]), compar);
	if (scanf("%d",&j)!=EOF)
	{
    
    
		//if (j < arr[0])//最小值
		//{
    
    
			for (k = 0; k < n; k++)
			{
    
    
				if (j < arr[k])
				{
    
    
					Min(arr, j, n, k);
					n++;
					break;
				}
                else if(j>arr[n-1])
				{
    
    
					arr[n] = j;
                    n++;
				}
               
			}
		//}
		
	}
	for ( i = 0; i <n ; i++)
	{
    
    
		printf("%d ", arr[i]);
	}

	return 0;
}

方法2

以二分查找的方式去找交换值,在多次查找后,首尾相同时那么那个就是插入的那个值

图解
在这里插入图片描述

在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
int compar(const void* p1, const void* p2)
{
    
    
	return (*(int*)p1) - (*(int*)p2);
}

void swop(int arr[], int middle,int inter,int n)//交换
{
    
    
	int middle2 = middle;
	int middle3 = n - middle+1;
	while (middle3--)
	{
    
    
		arr[n]= arr[n - 1];
		n = n - 1;
	}
	arr[middle2] = inter;
}

int  insertion(int arr[], int inter, int n)//寻找插入值
{
    
    
	int frist = 0;
	int end = n-1;//最最后的那个元素
	int middle;

	if (inter != 0)
	{
    
    
		while (frist <= end)
		{
    
    
			middle = (frist + end) / 2;//需要换的位置3

			if (arr[middle] < inter)
			{
    
    
				frist = middle + 1;
			}

			else if (arr[middle] > inter)
			{
    
    
				end = middle - 1;
			}
		}

		if (arr[middle] < inter)
		{
    
    
			return middle + 1;
		}
		else
		{
    
    
			return middle;
		}
	}
	else
	{
    
    
		return 0;//插入数为0时
	}

	
}

void print(int arr[],int n)
{
    
    
	int i;
	for ( i = 0; i <= n; i++)
	{
    
    
		printf("%d ", arr[i]);
	}
}


int main()
{
    
    
	int n;
	int arr[50];
	   scanf("%d", &n);
		int i;
		for (i = 0; i < n; i++)//输入数
		{
    
    
			scanf("%d", &arr[i]);
		}
		int inter;
		scanf("%d", &inter);

		qsort(arr, n, sizeof(arr[0]), compar);//排序

		int ret= insertion(arr, inter, n);//middle

		swop(arr,ret,inter,n);//交换

		print(arr,n);//打印
	return 0;
}

有错误请直接指出谢谢

猜你喜欢

转载自blog.csdn.net/Legwhite/article/details/118353258