[c/c++] programming之路(14)、数组+冒泡和选择排序
一、数组的基本知识
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 void main0(){ 5 int a[5]={1,2,3,4,5};//数组在内存里是连续排列的 6 int i;//VS2012版本,变量的声明要放在最前面(所以建议大家使用VS2013及之后的版本) 7 printf("%d\n",sizeof(a));//求内存占多少 8 printf("%d\n",sizeof(a)/sizeof(int));//求数组有多少个元素 9 printf("%x\n",a); 10 11 for (i = 0; i < 5; i++)//java语言中的a.length在这儿行不通,只能sizeof(a)/sizeof(int) 12 { 13 printf("a[%d]=%d &a[%d]=%x\n",i,a[i],i,&a[i]); 14 } 15 16 system("pause"); 17 } 18 19 void main1(){ 20 int i; 21 int a[10];//数组越界不报错 22 //因为数组外部的内存空间,不确定是否有权限, 23 //如果越界访问,程序会崩溃 24 for (i = 0; i < 1600; i++) 25 { 26 a[i]=i+1; 27 } 28 getchar(); 29 }
二、const和define的区别(const代码不可更改,可在内存里更改;define放在常量区,无论如何无法修改)
1 #include<stdio.h> 2 #include<stdlib.h> 3 #define N 20 4 5 void main(){ 6 int a[N]; //只有define可以 7 //printf("%d", &N); 报错,编译器放在常量区,没有地址,无从修改 8 9 const int num = 10; //可变的常量,可以强制去掉常量的属性 10 //num = 12; const限定代码不能修改,在内存有实体,是可以变的数 11 printf("%x", &num); 12 //int b[num];//这样不可以 13 14 system("pause"); 15 }
三、数组初始化
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 void main(){ 5 //int num[10]={1,2,3,4,5,6,7,8,9,10}; 6 //int num[10]={1,2,3,4,5,6,7,8};//不足部分,填充为0 7 //double num[10]={1,2,3,4}; 8 //数组元素大小已经确定,下标可以省略 9 //double num[] = { 1, 2 }; 10 //double num[] = {};//无法指定数组的大小,无法分配内存 11 double num[10] = { 0 }; 12 printf("%x",&num); 13 getchar(); 14 }
四、数组操作说明
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 void main4(){ 5 int a[3]={1,2,3}; 6 int b[3]; 7 int i; 8 //b=a; 数组不能进行赋值,数组名是一个地址常量 9 printf("%x\n", a); 10 for (i = 0; i < 3; i++) 11 { 12 scanf("%d", &a[i]); 13 printf("%d\n", a[i]); 14 } 15 system("pause"); 16 } 17 18 void main5(){ 19 char str[5] = { '1', 'a', '3', 'm', '\0' };//以'\0' 结束才不会出现“烫烫” 20 //char strm[15] = { 'c', 'a', 'l', 'c' }; 21 char strm[5] = { 'c', 'a', 'l', 'c' ,'\0'}; 22 char strn[13] = "notepad";//双引号会自动加上/0 23 scanf("%s", strn); //只有字符串才能整体输入输出 24 printf("%s", str); 25 system(strm); 26 system(strn); 27 system("pause"); 28 }
五、数组访问
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 void main(){ 5 int num[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 6 int i; 7 for (i = 0; i < 10; i++) 8 { 9 printf("%d,%d,%x,%x\n", num[i],*(num+i),&num[i],num+i); 10 //num[i]与*(num+i)等价 &num[i],num+i等价 11 } 12 printf("\n逆序\n"); 13 for (i = 9; i >= 0; i--) 14 { 15 printf("%d,%x\n", *(num + i), num + i); 16 } 17 18 getchar(); 19 }
六、斐波那契数列
1 #include<stdio.h> 2 #include<stdlib.h> 3 //F(n)=F(n-1)+F(n-2) 4 void main(){ 5 //int a[50]; int最后会越界 6 double a[50]; 7 int i; 8 a[0]=1.0; 9 a[1]=1.0; 10 for (i = 2; i < 50; i++) 11 { 12 a[i]=a[i-1]+a[i-2]; 13 printf("%f\n",a[i]); 14 } 15 getchar(); 16 }
七、选择排序法
求最大值
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h>//时间随机数 4 5 void main(){ 6 int num[10]; 7 time_t tms;//时间的数据类型 8 int i,X; 9 srand((unsigned int)time(&tms));//设置随机数种子 10 for (i = 0; i < 10; i++) 11 { 12 num[i]=100+rand()%100; 13 printf("%d\n",num[i]); 14 } 15 16 X = 0;//0是下标,我先假定0是最大的数 17 for (i = 1; i < 10; i++) 18 { 19 if (num[X] < num[i]) 20 { 21 X = i; 22 } 23 } 24 printf("max=%d\n",num[X]); 25 getchar(); 26 }
设置了随机数种子,每次的值都不一样
升序排列
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h>//时间随机数 4 5 void main(){ 6 int num[10]; 7 time_t tms;//时间的数据类型 8 int i,j,tmp; 9 srand((unsigned int)time(&tms));//设置随机数种子 10 for (i = 0; i < 10; i++) 11 { 12 num[i]=100+rand()%100; 13 printf("%d\n",num[i]); 14 } 15 16 for (i = 0; i < 10-1; i++)//注意是 i<数组.length-1 17 { 18 for (j = i+1; j < 10; j++)//注意是 j=i+1 19 { 20 if(num[i]>num[j]){//升序 21 tmp=num[i]; 22 num[i]=num[j]; 23 num[j]=tmp; 24 } 25 } 26 } 27 printf("\n排序以后\n"); 28 for (i = 0; i < 10; i++) 29 { 30 printf("%d\n", num[i]); 31 } 32 getchar(); 33 }
八、冒泡排序法(效率不如选择)
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h>//时间随机数 4 5 void main(){ 6 int num[10]; 7 time_t tms;//时间的数据类型 8 int i,j,tmp; 9 srand((unsigned int)time(&tms));//设置随机数种子 10 for (i = 0; i < 10; i++) 11 { 12 num[i]=rand()%100; 13 printf("%d\t",num[i]); 14 } 15 //开始冒泡排序 16 for (i = 0; i < 10-1; i++) 17 { 18 for (j = 0; j < 10-1-i; j++) 19 { 20 if(num[j]>num[j+1]){ 21 tmp=num[j]; 22 num[j]=num[j+1]; 23 num[j+1]=tmp; 24 } 25 } 26 } 27 printf("\n排序以后\n"); 28 for (i = 0; i < 10; i++) 29 { 30 printf("%d\t", num[i]); 31 } 32 getchar(); 33 }
九、数组与函数
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 void go(int a[10]){//数组作为参数的时候,是传递地址 5 int b[20]; 6 printf("go=%d\n",sizeof(a)); 7 printf("%d",sizeof(b));//这里的数组b非参数,即实际大小 8 } 9 10 void main(){ 11 int a[10]; 12 printf("%d\n",sizeof(a)); 13 go(a); 14 getchar(); 15 }