一些关于有序序列的题目--可以练练,积累经验
1.有序序列判断
有序序列判断 点击进去牛客网练习
这里有序分为正序和逆序,数据呢要么递增,要么递减才符合。那怎么判断呢?
我们可以设置两个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.有序序列插入一个整数
这里要插入一个数,然后要求输出要有序,也就是把这个数也根据大小排进去,我们可以从这个数组的arr【i】(i=n-1)后面开始进行比较,最后面的数字与insert(插入的数字)比较如果小于那么直接把插入的数字放在最后面,如果大于插入的数字那么就要往后面覆盖,留出一个位子,然后再让倒数第二个数与insert比较如果还大于那么就往后走,…直到有一个数比insert小那么就直接让insert插进arr【i+1】里去然后break跳出循环。
这里还有一个比较头疼的事那就是要考虑边界问题,有些问题如果不考虑的话就要出问题,这题就是,如果有这种情况insert比arr数组中的所有数都小,那么arr整个数组都往后覆盖了一格,但insert,并没有插进去,这就很尴尬
所以我们需要再讨论一下就讨论如果这个arr【0】>insert那么这种情况就是图上所示的了,需要把insert插入到第一个位子上去。
代码如下:
#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是用来存放两个数组对比出来较小的先放进去,较大的数后放进去,那么该怎么放呢?
首先让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;然后这个循环结束了就表面有一个数组遍历完了,但不知道哪一个要分类一下,如果是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; }