助力快速掌握 冒泡排序 原理及应用 使有限时间 具备无限可能 |
我们的初衷是将一种简单的生活方式带给世人 为初学者节省宝贵的时间,避免采坑! |
Chinar 教程效果
1
Intro —— 简介
冒泡排序/Bubble Sort,是一种较简单的排序算法。
运行原理:
1. 通过循环遍历要排序的元素序列;
2. 依次比较相邻的两个元素,根据要求条件(大/小),交换两元素位置,从而使最(大/小)元素到达数列顶端;
3. 多次循环,直到没有相邻元素需要交换,表明数列以排序完成。
因数列中的最(大/小)元素,经交换,慢慢"浮动"
到数列顶端。
如同气泡由水底上浮到水面的过程一般,因此得名- 《冒泡排序》
2
Demo —— 例子
第一种方案:
按照基本概念,代码设计实现后,发现循环了90次,才将数列排好。
for (int j = 0; j < ints.Length; j++) //使以下循环执行多次:ints.Length 次
{
/*从头到尾,依次访问元素。
循环一次后,最大元素已经交换到了数列最右边。也就是ints[ints.Length - 1]一定是最大的。
*/
for (int i = 0; i < ints.Length - 1; i++)
{
cycleIndex++; //计数
if (ints[i] > ints[i + 1]) //比较两个相邻元素,将两者数据交换
{
ints[i] += ints[i + 1];
ints[i + 1] = ints[i] - ints[i + 1];
ints[i] = ints[i] - ints[i + 1];
}
}
}
执行后
元素值:0
元素值:1
元素值:2
元素值:3
元素值:5
元素值:6
元素值:7
元素值:8
元素值:9
元素值:10
----------------------------------------------
循环次数:90
Chinar
总结,对于新手来讲,冒泡排序会有哪几个难点:
-
两层循环的意义:
外层循环决定本次排序需要 排几轮,有几个数排几轮,内层循环是真正的比较相邻两数的大小
-
内层循环J的取值范围:
数据长度-已排序好数据个数-1
,为什么要减一:因为从第一个数开始与自身往后一索引数比较,所以不能为 -最后一个数,因此要减一,也就是说当j等于倒数第二个数时,整个数列都比较了一遍
3
Demo2 —— 例子2
第二种方案:
我们浪费的就是每次已经处理过的数据,我们再次进行了循环比较,这样做毫无意义。
for (int j = 0; j < ints.Length; j++) //使以下循环执行多次
{
/*只从头到尾,依次访问元素。
循环一次后,最大元素已经交换到了数列最右边,也就是最后一个元素此时最大。
那么下一轮循环比较时,就无需再比较它,浪费一次循环。
我们无需将已经浮动到右端的元素,再做比较。
优化:需要在每一轮循环比较时,跳过我们已经处理过的数据。
这样 45次循环,即可完成排序
*/
for (int i = 0; i < ints.Length - j - 1; i++)
{
cycleIndex++; //计数
if (ints[i] > ints[i + 1]) //比较两个相邻元素,将两者数据交换
{
ints[i] += ints[i + 1];
ints[i + 1] = ints[i] - ints[i + 1];
ints[i] = ints[i] - ints[i + 1];
}
}
}
执行后
元素值:0
元素值:1
元素值:2
元素值:3
元素值:5
元素值:6
元素值:7
元素值:8
元素值:9
元素值:10
----------------------------------------------
循环次数:45
在每一轮循环比较时,跳过我们已经处理过的数据。
这样 45次循环,即可完成排序
4
Other —— 其他写法
至此:完!
支持
May Be —— 开发者,总有一天要做的事!
Chinar 提供一站式《零》基础教程 使有限时间 具备无限可能! |
Chinar 免费服务器、建站教程全攻略!( Chinar Blog )


本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究
对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com
对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址