数组、冒泡排序、选择排序

一、一维数组

程序:

结果:

总结:

(1)12行的结果为40:系统会为一个数组分配一段连续的存储空间。每个数据元素占用的字节数,就是基类型的字节数,一个元素占4个字节。int array1[10];由于数组1是int型的(占四个字节),而且数组1里有10个元素。则有4*10=10。

  (2)for循环是为了把数组2,3,4,5的第0个元素到第2个元素共三个元素都一一列出来。

(3)由结果我们知道:

a.在定义数组时可以按照常量表达式中的数字赋以对应个数的初值,如数组2;

b.可以只给一部分元素赋值,后面元素值为0,如数组3;

c.如果想使一个数组中全部元素值为0,可以写成数组4的形式(只写一个0),也可以写成int array4【3】={0,0,0};(全部列出来);

d.在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。如数组5。

二、二维数组

程序:

扫描二维码关注公众号,回复: 3612902 查看本文章

结果:

总结:

(1)sizeof( )数组a的结果是24是因为:该数组是int型(占4字节),且为3行2列的二维数组,所以有4*3*2=24。

(2)外循环for控制二维数组的行,内循环for控制的是二维数组的列。

(3)由结果可知有4种方法对二维数组初始化:

a.分行给二维数组赋初值,用花括号把每行隔开。如a1。

b.可以将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值。如a2。

c.可以对部分元素赋初值。如a3。也可以对各行中的某一元素赋初值,如int a[3][4]={{1}, {0,6}, {0, 0, 0, 11}};

d.如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。如a4。

(4)\t 水平制表符号,俗称空格符号,其主要作用是输出时候的自动对齐作用。相当于输出八个空格效果。

注意前三个输出为\t,最后一个为\n.

三、冒泡排序

冒泡排序顾名思义就是整个过程像气泡一样往上升,单向冒泡排序的基本思想是(假设由小到大排序):对于给定n个记录,从第一个记录开始依次对相邻的两个记录进行比较,当前面的记录大于后面的记录时,交换位置,进行一轮比较和换位后,n个记录的最大记录将位于第n位,然后对前(n-1)个记录进行第二轮比较;重复该过程,直到记录剩下一个为止。

例子:

将一维数组a中的元素由小到大一次排序。

步骤:

1、从前往后比较相邻的元素。如果第一个比第二个小,就交换他们两个。

2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最小的数。

3、再重复相同的动作,倒数第二位元素变成第二小的数。

程序:

结果:

总结:

(1)内循环 j (交换次数),外循环 i (冒泡次数)的初值与条件,以及内循环时内部进行交换的情况:

(3)输出部分:输出冒泡排序每次冒泡之后元素交换的情况。

输出位置:外循环表示冒泡的次数则printf函数应该嵌套在外循环里

输出内容:分别输出每次冒泡第0~9交换后的a [ j ] ,所以printf外又有一个for循环

四、选择排序

初始时在序列中找到最小(大)元素,放到序列的起始位置作为已排序序列;然后,再从剩余未排序元素中继续寻找最小(大)元素,放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

      选择排序与冒泡排序的区别:冒泡排序通过依次交换相邻两个顺序不合法的元素位置,从而将当前最小(大)元素放到合适的位置;而选择排序每遍历一次都记住了当前最小(大)元素的位置,最后仅需一次交换操作即可将其放到合适的位置。

例子:

将一维数组a中的元素由小到大一次排序。

程序:

结果:

总结:

(1)选择排序的步骤:

    

(2)确定程序代码的写入

程序:

结果:

总结:

(1) %p = 0x%x。以十六进制无符号形式输出整数,输出前导符0x。

(2)array数组名存放着数组整个元素的首地址,也是数组首元素的地址:array = array [ 0 ]。所以,array + 1 等于array + 一个基类型长度。array + 1 = array + 1 *sizeof ( int )  = 0 + 1 * 4 = 4 , 相差4字节。

(3)当数组名遇到&,如,&array表示整个数组:数组首元素的地址再取地址→上升一级变成整个数组。

          &array [ 0 ]+ 1 = &array [ 1] = &array + 1 * sizeof( int )  = 0 + 1 * 4 = 4 ,相差4字节。

(4)&array+1则为跳过整个数组。&array+1 = &array + 3*sizeof( int ) = 0 + 3 * 4 =12。

程序:上个例子二维数组的情况

结果:

总结:

(1)&a[ 0 ] [ 0 ] +1 = &a[ 0 ] [ 1 ] = &a[ 0 ] [ 0 ] + 1*sizeof ( int ) = 0 + 1 * 4 = 4  变换的是列与一维数组没差别

  (2)  &a[ 0 ] +1 = &a[ 1 ] = &a[ 0 ] + 8   变化的是行,会跨过两列,(本数组是三行两列的),相当于跨过两个一维数组,则相差2*4=8

3) a+1 与 a 相差8,a = a [ 0 ]  ,a+1 = a [ 0 ] +1  变化的是行,会跨过两列,(本数组是三行两列的),相当于跨过两个一维数组,则相差2*4=8

(4) 跳过整个数组:&a +1 = &a + 3*2*sizeof( int ) =&a + 24

猜你喜欢

转载自blog.csdn.net/lishasha5/article/details/81232560