一些关于有序序列的题目--可以练练,积累经验

  • 1.有序序列判断
  • 2.有序序列插入一个整数
  • 2.有序序列合并


1.有序序列判断

有序序列判断 点击进去牛客网练习

有序序列Python 有序序列类型_数组


这里有序分为正序和逆序,数据呢要么递增,要么递减才符合。那怎么判断呢?
我们可以设置两个flag,flag1代表升序,flag2代表降序。然后遍历下数组,用后面面的数减去前面的数,如果>0,则flag1++;如果<0,则flag2++;这里呢比较的话n个数比较n-1次就可以了。所以如果最后flag1==n-1或者flag2= =n-1,则表面这个数组是有序的否则不是。

#include <stdio.h>
int main()
{
	int n;
	int i;
	scanf("%d", &n);
	int arr[100];
	int count1 = 0;
	int count2 = 0;
	for (i = 0;i < n;i++)
	{
		scanf("%d", &arr[i]);
	}
	for (i = 0;i < n-1;i++)
	{
		if (arr[i + 1] - arr[i] >= 0)
		{
			count1++;
		}
		else
		{
			count2++;
		}

	}
	if (count1 == n - 1 || count2 == n - 1)
	{
		printf("sorted\n");
	}
	else
	{
		printf("unsorted\n");
	}
	return 0;
}

2.有序序列插入一个整数

有序序列插入一个整数

有序序列Python 有序序列类型_#include_02


这里要插入一个数,然后要求输出要有序,也就是把这个数也根据大小排进去,我们可以从这个数组的arr【i】(i=n-1)后面开始进行比较,最后面的数字与insert(插入的数字)比较如果小于那么直接把插入的数字放在最后面,如果大于插入的数字那么就要往后面覆盖,留出一个位子,然后再让倒数第二个数与insert比较如果还大于那么就往后走,…直到有一个数比insert小那么就直接让insert插进arr【i+1】里去然后break跳出循环。
这里还有一个比较头疼的事那就是要考虑边界问题,有些问题如果不考虑的话就要出问题,这题就是,如果有这种情况insert比arr数组中的所有数都小,那么arr整个数组都往后覆盖了一格,但insert,并没有插进去,这就很尴尬

有序序列Python 有序序列类型_有序序列Python_03


所以我们需要再讨论一下就讨论如果这个arr【0】>insert那么这种情况就是图上所示的了,需要把insert插入到第一个位子上去。

有序序列Python 有序序列类型_i++_04


代码如下:

#include <stdio.h>
int main()
{
	int n;
	scanf("%d", &n);
	int i;
	int arr[100];
	for (i = 0;i < n;i++)
	{
		scanf("%d", &arr[i]);
	}
	int insert;
	scanf("%d", &insert);
	for (i=n-1;i>=0;i--)
	{
		if (arr[i] > insert)
		{
			arr[i + 1] = arr[i];
		}
		else
		{
			arr[i + 1] = insert;
			break;
		}
	}
	if (arr[0] > insert)
	{
		arr[0] = insert;
	}
	for (i = 0;i < n+1;i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

2.有序序列合并

有序序列合并

这里要注意有序的特点,然后遍历两数组即可。要求输入两组有序序列,然后合并再输出一个新的有序序列,这里肯定要先定义三个数组,arr1,arr2,arr3来存放数据,我们可以根据有序的特点来想,用i来遍历arr1,用j来遍历arr2,然后arr1[ i ]与arr2[ j ]来对比,arr3是用来存放两个数组对比出来较小的先放进去,较大的数后放进去,那么该怎么放呢?

有序序列Python 有序序列类型_数组_05


首先让arr1【i】与arr2【j】比较如果arr1<arr2则将arr1放进arr3中,然后让i++,k++(k是用来遍历arr3的)可以看图 1< 3 那么将1放进arr3中 i++,(k也要++)变成2再与arr2比较还是比3小,把2放进arr3中,i++,k++,5与3相比大于则把arr2中的3放进arr3,然后j++,k++,就这样直到arr1比完,那么arr2中剩余的数可以直接放进arr3中了,因为有序的特点。这个过程是个循环,条件也就是i<n,并且j<m;

有序序列Python 有序序列类型_#include_06


然后这个循环结束了就表面有一个数组遍历完了,但不知道哪一个要分类一下,如果是arr1先遍历完(也就是i==n了),那么需要将arr2中剩下的数放进arr3中,如果是arr2先遍历完(也就是j= =m了),那么需要将arr1中的数放进arr3中,前面的i 和j 已经有了,这里就不用知道循环结束的值直接for(;j<m;j++)或者for(;i<m;i++);把剩下的数放进arr3中时k的值也要一起变喔每次塞进一个数k都要++一下。到这里就把数都从小到大的放进了arr3中了。

int main()
{
	int n, m;
	scanf("%d%d", &n, &m);
	int arr1[1000];
	int arr2[1000];
	int arr3[2000];
	int i;
	for (i = 0;i < n;i++)
	{
		scanf("%d", &arr1[i]);
	}
	for (i = 0;i < m;i++)
	{
		scanf("%d", &arr2[i]);
	}
	//遍历找出比较小的放前面大的放后面//注意这里面的i要重新赋值为0;
	int j = 0;//用j来遍历arr2
	i = 0;//用i在遍历arr1
	int k = 0;//k用来遍历arr3
	while (i < n && j < m)
	{
		if (arr1[i] < arr2[j])
		{
			arr3[k++] = arr1[i++];
		}
		else
		{
			arr3[k++] = arr2[j++];
		}
	}
	if (i == n)
	{
		for (;j < m;j++)
		{
			arr3[k++] = arr2[j];
		}
	
	}
	else
	{
		for (;i < n;i++)
		{
			arr3[k++] = arr1[i];
		}
	}
	for (i = 0;i < n + m;i++)
	{
		printf("%d ", arr3[i]);
	}
	return 0;
}