123下一页
返回列表 发新帖

【编程基础】C语言教程(2)循环(1)冒泡算法

  [复制链接]

3

主题

37

回帖

249

积分

小学生

Rank: 2

金币
-210
好评
16
信誉
83
发表于 2019-3-8 17:59:13 | 显示全部楼层 | 阅读模式  来自 广东
本帖最后由 lucien2714 于 2019-8-24 21:56 编辑

大噶好,我回来了,不知道大家还记不记得我上一篇教程(https://bbs.binmt.cc/thread-14047-1-1.html)在上一篇教程中,我教了各位如何使用C4droid,以及最基础的一些函数(if, else if,else,switch,printf,scanf,return)(忘记了赶紧去重温一下!!
作业答案:
1.首先如果数字过大,大过int范围会出错,还有用户输入负数也会输出“你好小孩”,解决方案:用long long 在你好小孩那里加一个边界(将if改成if(age>=0&&age<=10))
                 2.略


那么,我们这篇教程学for循环以及冒泡算法。
我们先来理解一下什么是“循环
字面意思:

但是,C语言的循环和这个有点点不同,c语言中大概就是:重复执行一段特定的代码。

且C语言里面的循环有多种方法来实现,常见的有用for和while函数
我们这节课只讲for函数:
使用方法:
for(单次表达式;条件表达式;表达式
{
特定代码;
}


好了,又到了万众瞩目的分析时间 了(此刻应有bgm)
首先 单次表达式,意思就是只会执行一次的表达式(何为表达式?百度啊!!!其实就是类似方程
条件表达式,就是一种条件,只要这个条件是真(条件成立)就执行特定代码。
等特定代码执行完才执行末尾的表达式
  1. for (int a = 0; a < 100; a++){
  2. printf("%d ", a);
  3. }
复制代码


这是一个简单的例子,分析一下


首先int a = 0;第一课的知识 申明一个变量a,给他赋值0。
a<100;条件表达式,当a<100成立就执行第二行:printf("%d ",a);第一课的知识,输出a和一个空格
执行完printf("%d ", a);后,再运行末尾的表达式(a++)
何为a++,“++”是自增运算符,使a(++左边的变量)增加1。
运算符是个很重要的东西,可以让你的程序可读性增加!这很重要!
百度百科上有个很详细的表,各位有兴趣可以去阅读,链接
让我们来看看结果


结果中,第一个数字为0,末尾为99,证实了末尾的表达式是运行了特定代码后才执行的

为什么呢?且听我一一道来
1.首先,因为int a=0;所以此时a=0; a<100条件成立,于是就输出了a,如果是先执行末尾的表达式,那结果应该是1 而并非0
2.而最后一个数字是99而并非100,因为a=99输出了后,就执行了末尾的表达式(a++),那么使a=100,a=100自然条件表达式不成立,也就不运行特定代码了!
上两行信息量略大,请多看几遍,理解ta,不然很容易混乱
ps:过来人的经验
好了,讲完for循环,可以开始讲冒泡排序了!




冒泡排序,就是你给他一串数字,它按照从小到大的顺序排序起来,冒泡排序是很慢的(所以开发中不推荐使用),但是有助于我们理解排序,所以我们这就用冒泡排序


冒泡排序理解很简单,就是你存储了这几个数字后,将第一个和第二个对比,若第二个更大就两个换位,然后第二个跟第三个对比...直到最后一个的上一个和最后一个对比,
但是一次对比是对比不完的,所以我们需要双重循环来保证结果的正确性(这也是为什么冒泡排序最慢的原因之一)


但是,这有个难题:排序的数字一般有很多,我们总不能打int a,b,c,d,e,f,g....a1,b1,c1.....等等那样定义变量吧,
这时候我们就用到一个神奇的东西:数组
“数组是用于储存多个相同类型数据的集合。”----百度百科
啥意思呢,可以理解为,多个储存相同类型的值的箱子组成起来的柜子,
定义数组的方法为:   类型 名字[数量];
例如: int a[10];
然后a[0],a[1],a[2],a[9]都可以分别用来储存不同的int类型的值啦
注意,你定义的数组,例如int a[100],你能访问的只有0-99(100个),a[100]是不行的(数组越界,很麻烦的一个东西,百度走起)
  1. int a[11];
  2. for (int get = 0; get < 10; get++){
  3. scanf("%d", &a[get]);//读取数字
  4. }
  5. int temp; //定义一个变量来交换
  6. for (int j = 0; j<10; j++) //用一个嵌套循环来遍历一遍每一对相邻元素 (所以冒泡函数慢嘛,时间复杂度高)
  7. {
  8. for (int i = 0; i<10 -1 - j; i++)//因为每一趟都可以确定一个数,所以可以减少排序次数,由于j是0-9,所以需要加1
  9. {
  10. if (a[i]>a[i + 1]) //">"改为"<"这样就实现了从大到下排序
  11. {
  12. temp = a[i]; //基本的交换原理"c=a;a=b;b=c"
  13. a[i] = a[i + 1]; //因为如果a=b,那a的原本的值就丢失了,b=a其实就b=b(废话
  14. a[i + 1] = temp;//所以要创建一个变量c(在这里是temp)来储存a的值
  15. }
  16. }
  17. }
  18. for (int p = 0; p < 10; p++){
  19. printf("%d ", a[p]);//输出排序后的数组
  20. }
复制代码
冒泡算法的重点是比较相邻的两个数,我来模拟一下最极端的情况
原本的数组:9 8 7 6 5 4 3 2 1 0
排序一次:8 7 6 5 4 3 2 1 0 9
排序二次:7 6 5 4 3 2 1 0 8 9
排序三次:6 5 4 3 2 1 0 7 8 9
排序四次:5 4 3 2 1 0 6 7 8 9
排序五次:4 3 2 1 0 5 6 7 8 9
排序六次:3 2 1 0 4 5 6 7 8 9
排序七次:2 1 0 3 4 5 6 7 8 9
排序八次:1 0 2 3 4 5 6 7 8 9
排序九次:0 1 2 3 4 5 6 7 8 9

建议大家结合代码和模拟观看,有助于理解
因为不难,如果还是无法理解,建议百度一下,网上有很多关于冒泡排序的文章!


没了,就这样了
什么,你想问今天的作业?
hmmmm给你们放个假没作业(逃)
理解好冒泡算法就好了
溜了溜了第三篇:https://bbs.binmt.cc/thread-22449-1-1.html


已有5人评分好评 金币 理由
先生王 + 1 + 1
Chenghow + 2
爱上会飞的鱼 + 1 + 1 赞一个!
喵喵猫 + 1 + 2 赞一个!
无敌的我 + 1 + 1

查看全部评分 总评分:好评 +6  金币 +5 

回复

使用道具 举报

3

主题

37

回帖

249

积分

小学生

Rank: 2

金币
-210
好评
16
信誉
83
发表于 2019-3-8 18:00:15 | 显示全部楼层  来自 广东
前排占位等评论,顺便问问,你们比较喜欢什么颜色,红蓝黑颜色搭配会不会看的眼睛累?
回复

使用道具 举报

19

主题

2335

回帖

9114

积分

硕士生

Rank: 6Rank: 6

金币
6541
好评
3
信誉
102

考神MT论坛最佳新人MT论坛帅哥MT论坛新人

发表于 2019-3-8 18:12:42 来自手机  | 显示全部楼层  来自 河南
板凳
回复

使用道具 举报

107

主题

2595

回帖

8634

积分

硕士生

MT小白

Rank: 6Rank: 6

金币
3359
好评
42
信誉
101

MT论坛荣誉管理MT论坛新人MT论坛灌水老大

发表于 2019-3-8 18:14:20 来自手机  | 显示全部楼层  来自 广东
前排支持
回复

使用道具 举报

4

主题

2632

回帖

8268

积分

硕士生

Rank: 6Rank: 6

金币
2867
好评
10
信誉
100

考神

发表于 2019-3-8 18:33:27 来自手机  | 显示全部楼层  来自 江苏
不容易啊!就是看不明白
回复

使用道具 举报

17

主题

1212

回帖

5215

积分

版主

Rank: 7Rank: 7Rank: 7

金币
3008
好评
19
信誉
103

MT论坛帅哥2019-5.1节快乐

发表于 2019-3-8 18:34:22 来自手机  | 显示全部楼层  来自 河北
我一直都在观察你
回复

使用道具 举报

1

主题

3292

回帖

7290

积分

硕士生

Rank: 6Rank: 6

金币
3053
好评
1
信誉
100
发表于 2019-3-8 18:56:14 | 显示全部楼层  来自 广东
c语言学到指针真的好晕
回复

使用道具 举报

3

主题

37

回帖

249

积分

小学生

Rank: 2

金币
-210
好评
16
信誉
83
发表于 2019-3-8 18:57:04 | 显示全部楼层  来自 广东
白鸽. 发表于 2019-3-8 18:34
我一直都在观察你

回复

使用道具 举报

3

主题

37

回帖

249

积分

小学生

Rank: 2

金币
-210
好评
16
信誉
83
发表于 2019-3-8 18:57:21 | 显示全部楼层  来自 广东
adime2019 发表于 2019-3-8 18:56
c语言学到指针真的好晕

哈哈,指针是挺难得
回复

使用道具 举报

3

主题

37

回帖

249

积分

小学生

Rank: 2

金币
-210
好评
16
信誉
83
发表于 2019-3-8 18:58:05 | 显示全部楼层  来自 广东
无敌的我 发表于 2019-3-8 18:33
不容易啊!就是看不明白

没有吧,冒泡不算难了啊。。
回复

使用道具 举报

133

主题

4852

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
15
好评
116
信誉
100

考神MT论坛活跃会员MT论坛侠客MT论坛新人

发表于 2019-3-8 19:14:54 来自手机  | 显示全部楼层  来自 湖北
感谢版主分享
回复

使用道具 举报

7

主题

3607

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
11379
好评
0
信誉
100

2019-5.1节快乐MT论坛最佳新人考神

发表于 2019-3-8 20:20:53 来自手机  | 显示全部楼层  来自 安徽
感谢分享
回复

使用道具 举报

483

主题

2万

回帖

6万

积分

版主

喵喵,喵~

Rank: 7Rank: 7Rank: 7

金币
44805
好评
304
信誉
126

MT论坛灌水老大MT论坛最佳新人2019-5.1节快乐考神MT论坛侠客MT论坛活跃会员MT论坛新人挂机大佬

发表于 2019-3-8 21:28:13 来自手机  | 显示全部楼层  来自 山东
支持一下
回复

使用道具 举报

12

主题

7142

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
4206
好评
1
信誉
110
发表于 2019-3-9 00:04:42 来自手机  | 显示全部楼层  来自 福建
感谢分享
回复

使用道具 举报

212

主题

2746

回帖

7637

积分

硕士生

No Love No joy

Rank: 6Rank: 6

金币
30
好评
20
信誉
101

2019-5.1节快乐MT论坛帅哥MT论坛最佳新人考神

发表于 2019-3-9 00:44:09 来自手机  | 显示全部楼层  来自 广西
感谢大佬讲解啊!
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表