C语言进阶之旅 (刷题篇)一数列中插入一个数并保持正序
Posted 一个正直的男孩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}
以上是关于C语言进阶之旅 (刷题篇)一数列中插入一个数并保持正序的主要内容,如果未能解决你的问题,请参考以下文章