[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 }

 

posted @ 2017-08-19 14:32  进击的小猴子  阅读(466)  评论(0)    收藏  举报