手写算法:冒泡排序
Posted 骞牧学编程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手写算法:冒泡排序相关的知识,希望对你有一定的参考价值。
手写算法:冒泡排序什么是冒泡排序手写冒泡排序伪代码程序实现
什么是冒泡排序
我很喜欢玩扑克牌,当我玩扑克时,刚拿到牌时,牌是乱序的,我喜欢将手中的牌从左往右,由小到大排列。我是这样排列的:从左边第一张牌开始,和右边相邻的牌比较,如果左边的牌大,就和右边的牌交换,否则顺序不变。依据这个规则,继续比较第二张和第三张,第三张和第四张……一直到右边倒数第二张和最后一张,这样一轮下来,可以保证最大的牌会移到最右边的位置。这样的一轮比较可以称为一趟排序。
然后我们再按照如前所述规则,开始第二趟排序,最右边的牌可以不用比较,因为它已经有序(经过第一轮排序它是最大的)。当第二趟排序结束后,次大的牌就移到了右边倒数第二张,它也变成有序的了。
假设我们有n张牌,那我们只需要进行n-1趟排序就可以保证手里的牌是有序的了。
你可以思考一下是为什么?
以上的排序过程就是冒泡排序了,至于为什么叫冒泡排序,好像是说,排序的过程中,大数一直在在下沉,而小数就一直往上冒,就像冒泡一样。
手写冒泡排序
假如我们有一个整数数列:96,35,4,26,79,16,下面我们用冒泡的方法进行排序:
第一趟排序过程是这样的:
第一趟冒泡排序
如上图所示,第一趟排序总共进行了5次比较,第一次比较,96>35,所以两者交换位置,第二次比较,96>4,所以两者交换位置,第三次比较,96>26,所以两者交换位置,第四次比较,96>79,所以两者交换位置,第五次比较,96>16,所以两者交换位置。
第一趟排序后,最后数列变成:35,4,26,79,16,96,此时最大的数字96已经沉到最底部,96已经是有序的,以后的比较不用再比较96。
第二趟排序和第三趟排序放到了一起
二三趟冒泡排序
第二趟其实和第一趟排序是一样的,还是从第一个数字开始,两两比较,一直到倒数第二个数字16,96不用比较了,因为已经有序了,经过第二趟排序,数列变为:4,26,35,16,79,96,此时最大的两个数79,96已经有序。
类似的,经过第三趟排序后,数列变为:4,26,16,35,79,96,此时最大的三个数35,79,96已经有序。
第4趟和第5趟排序放到了一起
四五趟冒泡排序
经过前面的分析,我不再赘述,大家直接看图即好:
经过第四趟排序,数列变为:4,16,26,35,79,96,其实这时已经排好序了,但是我们是不知道的,我们仅知道最大的四个数26,35,79,16是有序的。所以还需要第五趟排序,再进行最后一次比较,经过第五趟排序,数列最后变为:4,16,26,35,79,96,此`时可以确定后5个最大的数是有序的,因为总共就6个数字,所以最后一个数字自然是有序的,我们不用再比较了。
这时我们可以说,经过五趟冒泡排序后,整个数列已经有序了。
伪代码
经过前面的分析,我们可以写出以下伪码:
for(i=0;i<n-1;i++)
for(j=0;j<n-i-1;j++)
if(a[j]>a[j+1])
a[j+1]<->a[j]
程序实现
int main()
{
int a[6] = { 96,35,4,26,79,16 };
int tmp = 0;
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5 - i; j++)
{
if (a[j] > a[j+1])
{
tmp = a[j+1];
a[j+1] = a[j];
a[j] = tmp;
}
}
}
std::cout << "after sort: ";
for (int i = 0; i < 6; i++)
{
std::cout << a[i] << " ";
}
std::cout << " ";
}
ps: 程序用C语言写的,但为了方便,输出函数用了C++的,请大家不要在意这些细节:)
以上是关于手写算法:冒泡排序的主要内容,如果未能解决你的问题,请参考以下文章