Tips:
-
int a[10]; 定义数组,指定数组包含10个元素
-
t=[6]; 引用a数组中序号为6的元素
-
比较大的数组要定义在函数外面,const int N =1e6+5;int a[N];
例一:对10个数组元素依次赋值0,1,2,3,4,5,6,7,8,9,要求按逆序输出
#include <stdio.h>
int main()
{
int a[10];//定义数组
for(int i=0;i<=9;i++){//对数组元素a[0]~a[9]赋值
a[i]=i;}
//或者这样 int a[10]={0,1,2,3,4,5,6,7,8,9};
for(int i=9;i>=0;i--)//输出a[9]~a[0]共10个数组元素
{
printf("%d ",a[i]);
}
return 0;
}
例二:输入10个整数存入一维数组,再按逆序重新存放后再输出

#include<stdio.h>
int main()
{
int a[10];//定义数组
for(int i=0;i<=9;i++)
{
scanf("%d",&a[i]);//对数组赋值
}
for(int i=0;i<=4;i++)
{
int t=a[i];//通过变量t实现a[i]和a[9-i]交换
a[i]=a[9-i];
a[9-i] = t;
}
for(int i=0;i<10;i++)//输出a[0]~a[0]十个数组元素
{
printf("%d ",a[i]);
}
return 0;
}
例三:输入n个整数,逆序输出
#include <stdio.h>
int main()
{
int a[105],n=0;//有时难以精确计算所需要的数组大小,数组声明应该稍大一些
while(~scanf("%d",&a[n])){
n++;//用这种方式可以知道数组中元素个数
}
for(int i=n-1;i>=0;i--)//实现a[i]到a[0]输出
{
printf("%d ",a[i]);
}
return 0;
}

👆这样写是错的,想知道个数就得先scanf a[0],而输入数据又需要使用循环(用到n)
*例四*:输入一组数据,判断有无重复,有则输出“Yes”,没有则输出“No”
输入:1 2 3 1
输出:1 2 3
#include <stdio.h>
int main()
{
int n,a[1005];
scanf("%d",&n);
int f=0;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
for(int i=0;i<n-1;i++){
for(int j=1;j<n;j++){
if(a[j]==a[i]){
f=1;
break;
}
}
}
}
if(f==0){
printf("No");
}
else{
printf("Yes");
}
return 0;
}
原来是👆这样写的 两个错误 一是应该当数据全部输入结束再进行比较(第一个for循环的后一个花括号位置放错了
二是j的初始条件写错了 int j=1的话 当i的值变成了1时 a[i]和a[j]一定相等
应该是和a[i]后一个数字比较 int j= i+1;
#include <stdio.h>
int main()
{
int n,a[1005];
scanf("%d",&n);
int f=0;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);}
for(int i=0;i<n-1;i++){
for(int j=1+i;j<n;j++){
if(a[j]==a[i]){
f=1;
break;
}
}
}
if(f==0){
printf("No");
}
else{
printf("Yes");
}
return 0;
}
查找和排序
(一)查找:
例四:输入一组数据(整数,不多于20个),查找指定的数据项是否存在。
输入:2(个数)1 2 2(最后一个是指定数据项)
输出:Yes
#include<stdio.h>
int main()
{
int n,a[25],s,i;
scanf("%d",&n);
for(i=0;i<=n-1;i++)
{
scanf("%d",&a[i]);
}
int x;
scanf("%d",&x);
int f =0;//为假
for(int i=0;i<=n-1;i++)//一定要有这一步 才能使x一个一个比对过去
{
if(x==a[i])
{
f=1;break; }//一定要break 查找到了就不要继续下去了!!!!!!!
}
printf(f?"Yes":"No");//f是否为真
return 0;
}
最后一步不能像下面这样写
for(i=0;i<=n-1;i++)
{
if(x==a[i])
{
printf("Yes");
break; }
else{
printf("No");//这样写的话 每次查找不到就会输出一个no
}
(二)排序:
题目:给4,2,8,5,7,1按从小到大排序输出
-
选择排序
举例: 2 3 5 1 6 4
第一次:1 3 5 2 6 4
第二次:1 2 5 3 6 4(而不是1 2 3 5 6 4

第一个数跟后面所有的数比,最小的放在第一个。第二个再跟后面所有的数比,最小的放在第二个。
👇输出最小数的序号
#include <stdio.h>
int main()
{
int a[]={4,2,8,5,7,1};
int n= sizeof a / sizeof a[0];//计算数据个数
int m= 0,i;
for(i=0;i<n;i++)
{
if (a[m]>a[i])//最小的放在初始位置
{
m=i;
}
}
printf("%d",m);
}
看n个数,k趟选择排序后的结果:
#include <stdio.h>
int main()
{
int i,n,k,a[1005];
scanf("%d %d",&n,&k);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<k;i++)//k趟选择排序
{
int m = i;//m记录最小值的下标
//未排序的数[i+1,n)查找最小值
for(int j=i+1;j<n;j++)
{
if (a[j]<a[m])
{
m=j;
}
}
//交换a[m]和a[i]
if(m!=i)/逆序情况
{
int t=a[m];
a[m]=a[i];
a[i]=t;
}
}
for(i=0;i<n-1;i++)
{
printf("%d ",a[i]);
}
if(i==n-1)
{
printf("%d",a[i]);
}
return 0;
}
完整代码(绝对值比较,并且输入0时数据输入结束)
#include <stdio.h>
#include <math.h>
int main()
{
int i,n,a[1005];
while(~scanf("%d",&n)&&n!=0){
for(int i=0;i<n;i++){
scanf("%d",&a[i]);}
for(int i=0;i<n-1;i++){//一定要注意 这里面i的范围 不能和上一步放在一起写!!
//因为第一个数和后面所有数字比较之后再下一步 一共只需要比较n-1次就够了
int m=i;
for(int j=i+1;j<n;j++){
if(abs(a[m])<abs(a[j])){
m=j;
}
}
if(m!=i){
int t=a[i];
a[i]=a[m];
a[m]=t;
}
}
for(int i=0;i<n;i++){
printf("%d ",a[i]);
}
printf("\n");
}
return 0;
}
如果是要求输出每趟排序并且排序完成即结束循环
如:
#include <stdio.h>
int main()
{
int n,a[105];
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<n-1;i++){
int m=i;
for(int j=i+1;j<n;j++){
if(a[m]>a[j]){
m=j;
}
}
if(m!=i){
int t=a[m];
a[m]=a[i];
a[i]=t;
}
else{
continue;
}
for(int k=0;k<n-1;k++){
printf("%d ",a[k]);
}
printf("%d\n",a[n-1]);
}
return 0;
}
-
冒泡排序

第一个数和第二个数比较,若逆序则交换;(前面的数字交换了以后再与下一个数比较,逆序则交换,直到最大的数到了最后一个位置。 例:4 2 8 5 7 1
比较次数👇 (n-1-i) i初始值为0
第一次:2 4 5 7 1 8 6-1-0次
第二次:2 4 5 1 7 8 6-1-1次
第三次:2 4 1 5 7 8
第四次:2 1 4 5 7 8
第五次:1 2 4 5 7 8
#include<stdio.h>
int main()
{
int a[]={4,2,8,5,7,1};
int n = sizeof a /sizeof a[0];
int i;
for(i=0;i<n-1;i++)//只需要排列n-1次 (因为i是从0开始的 所以是<而不是<=
{
for(int j=0;j<n-1-i;j++)
if(a[j]>a[j+1])
{
int t=a[j];
a[j]=a[j+1];
a[1+j]=t;
}
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
}
在两两交换过程中可能已经排好序了,如何优化呢?
(第二行
for(i=0;i<n-1;i++)//只需要排列n-1次 (因为i是从0开始的 所以是<而不是<=
{
int f=0;//作为交换标记
for(int j=0;j<n-1-i;j++)
if(a[j]>a[j+1])
{
int t=a[j];
a[j]=a[j+1];
a[1+j]=t;
f=1;//说明数据已经换好了
}
if(f==0) break;//上一步if不成立 f数值不改变
}
如果要求输出每趟并且排序完立刻结束:
#include <stdio.h>
int main()
{
int n, a[105];
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
for (int i = 0; i < n - 1; i++) {
int f = 0;
for (int j = 0; j < n - 1 - i; j++) {
if (a[j] > a[j + 1]) {
int t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
f = 1;
}
else{
continue;
}
}
if(f==0)
{
break;
}
for (int k = 0; k < n - 1; k++) {
printf("%d ", a[k]);
}printf("%d\n", a[n - 1]);
}
return 0;
}
如果是n个数排序呢?
#include <stdio.h>
int main()
{
int i,n=0,a[105];
while(~scanf("%d",&a[n])){
n++;//*****very important//主要是这一步
}
for(i=0;i<n-1;i++){
int f=0;
for(int j=0;j<n-i-1;j++){
if(a[j]<a[j+1]){
int t=a[j];
a[j]=a[j+1];
a[j+1]=t;
f=1;
}
}
if(f==0)break;
}
for(i=0;i<n;i++){
printf("%d ",a[i]);
}
return 0;
}

右图中的错误就是 没有给i初始值 这样系统会随机给初始值
可以看出循环k次时的数据 (中间输出)
#include <stdio.h>
int main()
{
int i,n,k,a[1005];
scanf("%d %d",&n,&k);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=1;i<=k;i++){
for(int j=0;j<n-i;j++)//
{
if(a[j]>a[j+1])//漏写了这一步!!!!!
{
int t=a[j];
a[j]=a[j+1];
a[1+j]=t;
}
}
}
for(i=0;i<n-1;i++)
{
printf("%d ",a[i]);
}
if(i==n-1)
{
printf("%d",a[i]);
}
return 0;
}
例五:绝对值排序
要求:输入数据有多组,每组的第一个数字为n,接着是n个整数,n=0表示输入数据的结束,所有的数的绝对值都不相等。
#include <stdio.h>
#include <math.h>
int main()
{
int a[105],n,i;
while(~scanf("%d",&n)&&n!=0){//注意这个花括号从哪到哪
for(i=0;i<n;i++){
scanf("%d",&a[i]);}
for(int i=0;i<n-1;i++){
for(int j=0;j<n-1-i;j++){
if(abs(a[j])<abs(a[j+1])){//直接在这里用abs函数就OK了 不用之前int 一个m
int t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
for (i=0;i<n;i++){
printf("%d ",a[i]);
}
printf("\n");
}
return 0;
}
例六:排两列
将一组数据按奇偶分两行输出 如图所示
会发现使用一个数组很难实现先输出奇数行 再换行 再输出偶数行

#include<stdio.h>
int main()
{
int a[105],n,m=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
if(i%2==1){
printf("%d ",x);//第奇数个直接输出
}
else{
//第偶数个数输出时 从a[0]开始 第二个数是a[0]第四个数是a[1]
a[m]=x;
m++;
}
}
printf("\n");
for(int i=0;i<m;i++){//注意这里i的范围是小于m而不是n
printf("%d ",a[i]);
}
return 0;
}
例七:结伴出行
输入偶数个数字 第一个和最后一个一起输出 第二个和倒数第二个一起输出

#include<stdio.h>
int main()
{
int n,a[55],i;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
//2.双指针i从前到后 j从后到前
for(int i=0,j=n-1;i<j;i++,j--){
printf("%d %d\n",a[i],a[j]);
}
return 0;
}