冒泡排序算法:
冒泡排序是相邻元素之间的比较
每一次将最大的元素送到最后的位置,实现每一趟排序确定一个位置的元素
#include <stdio.h>
const int N = 1010;
int a[N];
void swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
int main()
{
int n;
scanf("%d\n", &n);
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
for(int i = 0; i < n - 1; i++)
{
for(int j = 0; j < n - i - 1; j++)
{
if(a[j] > a[j + 1])
{
swap(a[j], a[j + 1]);
}
}
}
for(int i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
return 0;
}
选择排序算法
选择排序是对全局元素的比较,对比选取当前i及其后面所有元素中的最小元素
每一次可以确定一个位置的元素
#include <stdio.h>
const int N = 1010;
int a[N];
void swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
int main()
{
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
for(int i = 0; i < n; i++)
{
for(int j = i + 1; j < n; j++)
{
if(a[j] < a[i])
{
swap(a[j], a[i]);
}
}
}
for(int i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
return 0;
}
二维数组中的元素排列是"按行存放",先存放第一行的元素,再存放第二行,以此类推
设有一个m * n的数组,则第i行第j列的元素x[i][j]在数组中的位置:i * n + j
【注】对全部元素赋值时,只能省略行数,但不能省略列数
a[i] == *(a + i) &a[0][1] == a[0] + 1 a[i][j] == *(a[i] + j)
字符数组的初始化:可以通过为每个数组元素指定初始字符来实现
#include <string.h>
①输入字符串:gets()函数 -- 长度没有限制,保证字符数组有足够大的空间存放输入的字符串
该函数输入的字符串中允许包含空格,但scanf()函数不允许
scanf()并不能读取空格,遇到空格就会结束输入
②输出字符串:puts()函数 -- 将字符串输出,并用'\n'取代字符串末尾的'\0'
因此用puts()输出字符串时,不要求另外添加换行符
一次只能输出一个字符串,而printf()可以一次输出多个
字符串相关函数
strcmp(字符串1, 字符串2); -- 比较2个字符串的值
如果两字符出串相等,返回值为0
如果字符串1 < 字符串2,返回值为-1
如果字符串1 > 字符串2,返回值为1
【注】字符串不能借助'=='来比较,只能使用strcmp()函数
strcpy(字符串1, 字符串2); -- 将字符串2复制给字符串1
复制时,连同结束标志'\0'一起复制
不能借助'='复制,只能使用strcpy()
strcat(字符串1, 字符串2); -- 将字符串2连接到字符串1的末端,并存储在字符串1中
字符串1原来的结束标志'\0',也会被字符串2覆盖
strlen(字符串) -- 计算字符串的长度
【注】为实际长度,不包含结束标志'\0'
错题:
1.
char a[5];
gets(a);
printf("%s,%d\n", a, a[1]);
puts(a);
输入abjh口口后,输出结果为?
2.
char a[3] = "1a";
char b[5] = "1a2b";
int k = strcmp(a, b);
printf("%d", k);
执行结果为?
3.
char str[10] = "I am";
printf("%d\n", strlen(str));
输出结果为?数组的长度为?
【答案】
1. abjh口口, 98
abjh口口
输入的字符为6个,而数组大小只有5个,为何能全部输出来?
因为a是数组名,实质是一个指针变量的地址,因此用gets(a)函数取得的是数组a的首地址
2. -1(字符串1的长度 < 字符串2的长度)
3. 输出结果:-4(不计入'\0')
数组的长度:10(看的是数组定义时规定的大小)