C基础-07(冒泡排序、二维数组)

 (内容为学习笔记,如有错误,还望指正,如有遗漏,还望补充) 

1.冒泡排序

1)作用

        上节说到了一维整型数组,可以将很多个整型变量存储在一块,但是当我们需要整理这个数组的数据时会非常的不方便,这时候就需要对数组进行排序处理,让数组数据有变得有序

        为了方便数据处理,我们经常需要排序。排序的方法不止冒泡排序。为什么学习冒泡?因为它好写。冒泡排序是排序效率最低的排序方法之一。

 2)冒泡排序的原理

        以将数组数据排成升序为例。

        冒泡的原理(升序):比较数组中相邻的两个元素,前者大于后者,交换两个元素的值

         例如有数组 "a[7] = {7,6,3,4,5,2,1};",冒泡排序的过程如下。

        a.取a[0]元素,值7,与他后面的每一个元素进行比较大于a[1],a[0]与a[1]的值互换

        b.此时的数组a元素为{6,7,3,4,5,2,1},接下来比较a[1]==7和a[2] ==3,交换。。。以此类推,最后7会被交换到最后,即a[7] = {6,3,4,5,2,1,7};

        c.接下来重复上两个步骤,但是比较的过程中可以少比较1位(之后是前面比较过的次数n位),这样最后数组a就会以升序排列,即a[7] = {1,2,3,4,5,6,7};

3)具体代码

a.冒一个泡的过程

int main()
{	
	int a[] = {85, 72, 65, 79, 53, 95, 87};
	int i;
	//循环遍历整个数组,因为数组有7个数,所以我们需要比较7-1次
	for(i = 0;i < 7-1;i++)
	{
		if(a[i] > a[i+1])//比较相邻两个元素
		{
            //前者大于后者,就交换两个元素的值
			int temp = a[i];
			a[i] = a[i+1];
			a[i+1] = temp;
		}
	}
    //此时完成冒泡,输出查看结果
	for(i = 0;i < 7;i++)
	{	
		printf("%d ", a[i]);//72 65 79 53 85 87 95
	}
	printf("\n");
	return 0;
}

b.冒泡全过程

int main()
{	
	int a[] = {85, 72, 65, 79, 53, 95, 87};
	int i,j;
    //反复进行冒泡,需要进行N-1次冒泡,数组有序
	for(j = 0;j < 7-1;j++)
	{
        //内层循环用来冒一个泡,-j的目的是因为每一轮冒泡都比上一轮少比较一次
		for(i = 0;i < 7-1-j;i++)
		{
			if(a[i] > a[i+1])
			{
				int temp = a[i];
				a[i] = a[i+1];
				a[i+1] = temp;
			}
		}
	}
    //输出结果
	for(i = 0;i < 7;i++)
	{	
		printf("%d ", a[i]);
	}
	printf("\n");
	return 0;
}

2.二维数组

1)二维数组的本质

        数组元素是一维数组的数组

2)如何定义二维数组

int a[2][3];

//[2]说明a是有2个元素组成的数组。
//[3]说明a的每个元素,是一个3个元素组成的一维数组。
//int 说明作为a的子数组元素类型是int。
//这样的数组a我们简称为二维数组。

3)如何给二维数组元素赋值

a[0][1] = 10;//a[0]数组的1元素赋值  10   是int变量
a[1][2] = 20;//a[1]数组的2元素赋值  20	  是int变量

//那么能不能给a[0]赋值呢?
//不能,数组不能被整体赋值,只能对元素赋值,如果元素还是数组,那么就得对元素的元素赋值。

4)如何遍历二维数组

        使用双重for循环来遍历二维数组。

int main()
{
    int a[2][3];
    int i, j;
    for(i = 0;i < 2;i++)//遍历数组a,数组a有2个元素 分别是a[0]和a[1]
    {
        //遍历子数组
        /*
        i = 0时,遍历a[0]数组  a[0]数组有3个元素
        i = 1使,遍历a[1]数组  a[1]数组有3个元素
        */
        for(j = 0;j < 3;j++)
        {
            a[i][j] = i*j;//a[i][j]是一个整型变量
            printf("%d\n", a[i][j]);
        }
    }
    return 0;
}

5)二维数组初始化

        同一维数组一样,有默认初始化,部分初始化和完全初始化三种方法。

        默认初始化:

        在二维数组中,第一个角标表示数组的元素个数,所以默认初始化的时候,只有第一个角标可以省略。 第二个角标表示数组的元素类型,所以第二个角标一定不能省略。

int a[][3] = {{1,2,3},{4,5,6}};
int a[][3] = {1,2,3,4};
//默认补0

        部分初始化:

int a[2][3] = {1,2,3}; 
int a[2][3] = {{1},{2,3}};
//默认补0

        完全初始化:

int a[2][3] = {{1,2,3},{4,5,6}};

int a[2][3] = {1,2,3,4,5,6};
//在完全初始化中,里面的{}写不写无所谓

6)二维数组的类型

        二维数组的类型,实际上是数组中一维数组的元素类型

//整型
int a[2][3];
//字符型
char b[2][3];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值