版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)
《算法笔记》学习记录004
一、今日学习概览
p39~47
备注:
- 数组:长度为n,下标为0~(n-1)。
- 只要赋初值,没被赋值的默认初值为0;若未初始化,每个元素会是一个随机数。
- 给整个数组赋初值0:
int a[10]={0};
int a[10]={};
//memset函数
- 递推:根据一些条件,不断让后一位的结果由前一位或前若干位计算得来。
- 冒泡排序的比较次数:(假设排序的数字数为n)1+2+…+(n-1)
- 特别提醒:如果数组大小较大(大概10^6级别),则需要将其定义在主函数外面,否则会使程序异常退出,原因是函数内部申请的局部变量来自系统栈,允许申请的空间较小;而函数外部申请的全局变量来自静态存储区,允许申请的空间较大。
- memset函数:初学者只建议赋0或-1。其他用fill。
二、今日代码分析
2.23 冒泡排序
#include <stdio.h>
int main(){
int a[10]={3,1,4,5,2};
for(int i=1;i<=4;i++){ //进行n-1趟
//第i趟从a[0]到a[n-i-1]都与它们下一个数比较
for(int j=0;j<5-i;j++){
if(a[j]>a[j+i]){ //如果左边的数更大,则交换a[j]和a[j+i]
int temp=a[j];
a[j]=a[j+i];
a[j+i]=temp;
}
}
}
for(int i=0;i<5;i++){
printf("%d",a[i]);
}
return 0;
}
怎么肥事!
2.24 三维数组自增1
#include <stdio.h>
int main(){
int a[3][3][3];
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
for(int k=0; k< 3; k++){
scanf("%d",&a[i][j][k]); //输入三维数组a的元素
a[i][j][k]++; //自增
}
}
}
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
for(int k=0; k< 3; k++){
printf("%d\n",&a[i][j][k]); //输出三维数组a的元素
}
}
}
return 0;
}
这…什么鬼
2.25 memset函数
#include <stdio.h>
#include <string.h>
int main(){
int a[5]={1,2,3,4,5};
//赋初值0
memset(a, 0, sizeof(a));
for(int i=0;i<5;i++){
printf("%d", a[i]);
}
printf("\n");
//赋初值-1
memset(a,-1, sizeof(a));
for(int i=0;i<5;i++){
printf("%d", a[i]);
}
printf("\n");
return 0;
}
把1改成-1后:
#include <stdio.h>
#include <string.h>
int main(){
int a[5]={1,2,3,4,5};
//赋初值1
memset(a,1, sizeof(a));
for(int i=0;i<5;i++){
printf("%d", a[i]);
}
printf("\n");
return 0;
}