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