我们采用传统的三段式思维来学习:是什么?为什么?怎么做?
是什么?(摘自百度百科)
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。
以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。
举个栗子:
4 2 3 1 5
第一轮比较:
(1) 4 和 2比,4>2,它们交换位置 结果:2 4 3 1 5
(2) 4和 3 比,4>3,它们交换位置 结果:2 3 4 1 5
(3)4 和 1 比,4>1,它们交换位置 结果:2 3 1 4 5
(4)4和 5 比,4<5,不交换位置 结果:2 3 1 4 5
到此第一轮就比较完了。第一轮的结果是找到了序列中最大的那个数,并浮到了最右边。
比较时,每轮中第 n 次比较是新序列中第 n 个元素和第 n+1 个元素的比较(假如 n 从 1 开始)。
第二轮比较:
(1) 2和3比,2<3,不交换位置 结果:2 3 1 4 5
(2) 3 和1比,3>1,它们交换位置 结果:2 1 3 4 5
(3)3和4比,3<4,不交换位置 结果:2 1 3 4 5
到此第二轮就比较完了。第二轮的结果是找到了序列中第二大的那个数,并浮到了最右边第二个位置。
第三轮比较:
(1)2和1比,2>1,它们交换位置 结果:1 2 3 4 5
(2)2和3比,2<3,不交换位置 结果:1 2 3 4 5
到此第三轮就比较完了。第三轮的结果是找到了序列中第三大的那个数,并浮到了最右边第三个位置。
第四轮比较:
(1)1和2比,1<2,不交换位置 结果:1 2 3 4 5
至此,我们就比较完了。结果是1 2 3 4 5。
总结:
n 个数据,只需要比较 n–1 轮。因为每轮我们都把最大的数排到了最后边,所以每轮都会比较少一个数。
下面写一个程序:
#include <stdio.h>
//冒泡排序//
int main()
{
int a[]={12,43,1,3,6,5,4,7,9,8};//这里要注意的是数组的下标是从0开始的
int n=sizeof(a)/sizeof(a[0]);//存放数组a中元素的个数//
int buf;
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-1-i;j++)
{
if (a[j] < a[j+1])
{
buf = a[j];
a[j] = a[j+1];
a[j+1] = buf;
}
}
}
for (int i=0; i<n; i++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
输出结果是:43 12 9 8 7 6 5 4 3 1