冒泡排序(图文详解)
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
这个算法的名字由来(以升序为例)是因为越大的元素会经由交换慢慢“浮”到数列的顶端,就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
由上述效果图可知,每一轮的排序都会把当前序列最大值"浮"与排序末尾。那么,当有排序数组数量为 n n n时,仅需排序 n − 1 n-1 n−1轮即可排序完成。(由于每一轮都将最大值放在最后,则当将第二小的数放在最后时,即完成排序)
据上述图,可确立数组 a r r [ 15 ] = { 3 , 44 , 38 , 5 , 47 , 15 , 36 , 26 , 27 , 2 , 46 , 4 , 19 , 50 , 48 } arr[15] = \{3,44,38,5,47,15,36,26,27,2,46,4,19,50,48\} arr[15]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48}
PS:以下均以升序讲解,绿色表示较小数,黄色表示较大数,红色代表已经放好的最大数
第一轮排序
-
第一次
3 与 42 比较,3 小 42 大,不交换
-
第二次
42 与 38 比较 ,38 比 42小,交换。
结果:
⋮ \vdots ⋮ ⋮ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \vdots ⋮ ⋮ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \vdots ⋮
-
第14次
50 最大,被放在序列末尾
第二轮排序(从此轮开始只显示结果)
第三轮排序
第四轮排序
第五轮排序
第六轮排序
第七轮排序
第八轮排序
第九轮排序
第十轮排序
第十一轮排序
第十二轮排序
第十三轮排序
第十四轮排序
由上即可排序成功
代码实现
#include<iostream>
using namespace std;
int main()
{
int arr[15] = {3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
int length = sizeof(arr)/sizeof(arr[0]);
for(int i = 0 ; i < length - 1 ; i ++)
{
for(int j = 0 ; j < length - 1 - i ; j ++)
{
if(arr[j]>arr[j+1]) swap(arr[j],arr[j+1]);
}
}
for(int i = 0 ; i < length ; i ++) cout << arr[i] << ' ';
return 0;
}
代码分解
for(int i = 0 ; i < length - 1 ; i ++)
这一行是循环的轮数
for(int j = 0 ; j < length - 1 - i ; j ++)
这一行代表需要排序的下标
其中,j < length - 1 - i
意味着不用再判断已经放入最后的每轮最大数
< length - 1 ; i ++)`这一行是循环的轮数
for(int j = 0 ; j < length - 1 - i ; j ++)
这一行代表需要排序的下标
其中,j < length - 1 - i
意味着不用再判断已经放入最后的每轮最大数