零基础小白学习c语言基础篇-----------冒泡排序

Hello小伙伴们大家好,今天阿莹给大家讲一下数组的应用冒泡排序。在进入正题之前,阿莹希望每一位程序员每天得到充分休息尤其是我们的肩颈部位,并且每天都有一个好心情。

一.冒泡排序的思想

1.冒泡排序是数组作为函数参数的应用,它的思想是“将两两相邻的元素进行排序”,我们要进行排序假设为升序。

2.首先我们可以定义一个一维数组,数组元素为{10,9,8,7,6,5,4,3,2,1}进行升序排序。

3.进行比较

(1)例如10和9相比较

  10,9,8,7,6,5,4,3,2,1---->9,10,8,7,6,5,4,3,2,1……

   9,8,7,6,5,4,3,2,1,  10(这样完成了一趟的比较,并且一趟比较的数组需要比较9次)

 (2)主要包括两部分

   1)比较几趟      2)一趟比较几次

二.我的代码实现思想

1.循环方法

int main()
{
	int arr[] = { 10,9,8,7,6,5,4,3,2,1 };//定义一个一维数组存放我假设的降序数字
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	for (i = 0; i < sz - 1; i++)//要拍几趟,也就是这一组数排几次才能成升序 9塘9个数字
	{
		int j = 0;
		for (j=0;j<sz-1-i;j++)//每一趟每个数字和另外一个数比较的次数
		{ 
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

2.函数方法

1)想要跟小伙伴分享一下我当时做的时候范的错误

void sort(int arr[])
{
	int sz = sizeof(arr) / sizeof(arr[0]);/
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}
int main()
{
	int arr[] = { 10,9,8,7,6,5,4,3,2,1 };
	sort(arr);//所以
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

我们可以看到并没有升序(图)

这是为什么呢?

我们可以按f10调试一下,发信sz=1;小伙伴们这时候会发出迟疑,不应该是10吗?size为1,因为sort传过来arr是首元素的地址 4 / 4 = 1。

为了更好理解跟我看一下这组数据

int main()
{
    int arr[10] = { 0 };
    printf("%p\n", arr);
    printf("%p\n", arr+1);
    printf("%p\n", &arr[0]);
    printf("%p\n", &arr[0]+1);

//是整个数组的大小  40
    printf("%p\n", &arr);
    printf("%p\n", &arr+1);
    return 0;
}

他们+1之后地址就明显变化(图)区别还是蛮大的。

arr-->arr+1地址多了一个整型4个字节

&arr[0]首元素地址-->&arr[0]+1  多了一个整型4个字节

&arr(整个数组的大小)-->&arr+1   十六进制中多了28,转换为十进制 40 一整个数组大小

所以应该怎么该?

可以在主函数中把sz求出,用sort将sz传过来,(数组传参应该用数组接收更明了,但更准确的是用指针接受 int* arr, 两种都可以)是地址本质就是用指针,有点像传址调用。

通常来说数组名是受元素的地址,但sizeof(数组名),&数组名都是整个数组的大小,除此之外,除了之外i所有遇到的数组名都是数组首元素的大小。
2)正确方法

int main()
{
	int arr[10] = { 0 };
	printf("%p\n", arr);
	printf("%p\n", arr+1);
	printf("%p\n", &arr[0]);
	printf("%p\n", &arr[0]+1);

//是整个数组的大小  40
	printf("%p\n", &arr);
	printf("%p\n", &arr+1);
	return 0;
}
void sort(int* arr, int sz)
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}
int main()
{
	int arr[] = { 10,9,8,7,6,5,4,3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	sort(arr, sz);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

文章的最后,阿莹最近专业课每天都排的满满的,所学专业与计算机完全背道而驰。最近学习进度非常慢,如有错误恳请小伙伴指出,最后希望小伙伴们给阿莹一个机会动动发财的小手一键三连,阿莹虽然不是每天都有固定时间登录,但一定互关,一键三连!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值