(1)思路:每两个数依次进行比较,如果乱序则交换位置。比如升序排序,两个数比较,如果first>second,交换位置,即将first下沉。这样一来,第一轮比较将MAX沉到最底,第二轮比较则将第二大数沉到倒数第二,最后MIN浮到最顶。(降序同理)当前轮比较次数总比前一轮少1。
(结合下图理解)假设有n个数,要进行n-1轮的整体比较。假设i表示轮次,从下图可看出,i=1,2....n-1,关于i的循环可以表示为for(int i = 0;i < n-1;i ++)。
j表示每轮比较多少次,分别等于n-1,n-2....n=1,关于j的循环,如果的要表示的话,for(int j = 0;j < n-1; j ++)、for(int j = 0;j < n-2; j ++)......for(int j = 0;j < 1; j ++)。
很明显,这么多循环直接加进代码肯定会显得冗杂臃肿。这种情况我们要借助嵌套循环了,不难看出,其实i和j是有着一定联系的。i和j的关系:j=n-1-(i-1)。也等价于j=n-1-i(i=0,1......n-2)。j随着i变化而变化,i增大j减小,因此i在外层循环,j在内层循环。
如果比较arr[j]和arr[j + 1]),for循环中,j从0开始计数;如果比较arr[j] > arr[j - 1]),很明显j从1开始计数
![](https://i-blog.csdnimg.cn/blog_migrate/ff75cc6d525f99a59cf04a869c93777f.png)
(2)特点:简单稳定,但时间复杂度高,效率慢。
#include <stdio.h>
void swap(int *a, int *b)
{
int temp;
temp =*b;
*b= *a;
*a= temp;
return ;
}
int main()
{
int i;
int arr[5] = {2, 34, 6, 20, 11};
for (int i = 0; i< 4; i++) //总共比较4轮
{
for(int j=0;j<4-i;j++)
{
if (arr[j] > arr[j + 1])
{
swap(&arr[j],&arr[j+1]);
}
}
}
for(int i=0;i<5;i++)
printf("%d\n",arr[i]);
return 0;
}
~
(3)注意:
-
一开始我的swap函数采用值传递的方式,导致交换数据不成功。修改成了地址传递和引用传递,才运行成功。写法1取地址的方式可能报错:
error: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token void swap(int &a, int &b)
-
在C语言中是不存在“引用传递”的,&表示的不是引用,仅仅是取地址符。
-
swap函数下列写法出错。temp如果作为指针,不管是否初始化,都无法确定temp指向的内容在哪。
-
swap函数以下写法错误
-
int *temp = NULL; *temp = *b;
int *temp = NULL
声明一个指向int
类型的指针temp
,并将其初始化为NULL
。这意味着temp
指针当前不指向任何有效的内存位置。*temp = *b
尝试将b
指针所指向的值赋值给temp
指针所指向的位置。然而,由于temp
指针是空指针,即指向 NULL,解引用指向 NULL 的指针会导致未定义行为。正确的做法是先为temp
分配内存,然后再进行赋值。 -
swap函数以下写法无法实现交换
-
void swap(int *a,int *b)
{
int *temp = NULL;
temp = b;
b = a;
a = temp;
}
(4)问题:C文件使用引用传递时,报错: error: expected ‘;‘, ‘,‘ or ‘)‘ before ‘&‘ token
分析:C语言中其实不存在引用传递,只有C++支持
解决:将代码保存成.cpp文件,c++中支持引用
(5)参考文章:
(19条消息) C语言中 error: expected ‘;‘, ‘,‘ or ‘)‘ before ‘&‘ token 解决方法_迷途ぽ的博客-CSDN博客_error: ';' expected