1、了解了冒泡排序算法的原理后,实现起来其实是多种多样的,其核心就在于交换。
2、下面是两种不同的实现方法:
(1)实现一(较大的数向右边移动):
//************************************
// 参数a:数组首地址
// 参数n:数组大小
//************************************
void
BubbleSort1(
int
* a,
int
n)
{
for
(
int
i = 0; i < n - 1; i++)
{
for
(
int
j = 0; j < n - 1 - i; j++)
{
if
(a[j] > a[j + 1])
// 升序
{
a[j] = a[j] + a[j + 1];
a[j + 1] = a[j] - a[j + 1];
a[j] = a[j] - a[j + 1];
(2)为了阅读方便,定义一个用于交换的宏函数swap:
#define swap(x, y) (x = (x) + (y), y = (x) - (y), x = (x) - (y))
(3)则实现一可以改为:
//************************************
// 参数a:数组首地址
// 参数n:数组大小
//************************************
void
BubbleSort1(
int
* a,
int
n)
{
for
(
int
i = 0; i < n - 1; i++)
{
for
(
int
j = 0; j < n - 1 - i; j++)
{
if
(a[j] > a[j + 1])
// 升序
{
swap(a[j], a[j + 1]);
}
}
}
}
(4)实现二(与实现一相反的冒泡方向,较小的数向左边移动):
void
BubbleSort2(
int
* a,
int
n)
{
for
(
int
i = 0; i < n - 1; i++)
{
for
(
int
j = n - 1; j > i; --j)
{
if
(a[j] < a[j - 1])
// 升序
{
swap(a[j], a[j - 1]);
}
}
}
}
(5)注:在for语句中,前置或后置的自增/自减运算,对计算结果并无影响。即以下两句代码,效果一样:
for
(
int
j = n - 1; j > i; --j)
for
(
int
j = n - 1; j > i; j++)
(6)上述代码都是以升序为例做的,如需要改成降序,只需修改判断语句即可。
3、上述两种实现方法其实原理是一样的,就是一路交换相邻的两个数,将大的数放到右边(或是将小的数放到左边)。
4、但是,这里还有另一种实现方式,如我上一篇文章提到的,既然是求最大值,那么不一定要通过交换相邻位置的数来实现。
5、这里介绍另一种实现算法:确定最右边的位置为最大值,将其它位置的数与该位置的数比较,将较大的数放在该位置;具体仍以{1, 3, 8, 5, 7, 6, 9, 2, 0, 8}为例:
(1){1, 3, 8, 5, 7, 6, 9, 2, 0,8} 因为1<8,所以最右边仍为8;
(2){1, 3, 8, 5, 7, 6, 9, 2, 0,8} 因为3<8,所以最右边仍为8;
(3) {1, 3, 8, 5, 7, 6, 9, 2, 0, 8 } 因为8<8,所以最右边仍为8;
(4){1, 3, 8,5, 7, 6, 9, 2, 0, 8} 因为5<8,所以最右边仍为8;
(5){1, 3, 8, 5,7, 6, 9, 2, 0, 8} 因为7<8,所以最右边仍为8;
(6){1, 3, 8, 5, 7,6, 9, 2, 0, 8} 因为8=8,所以最右边仍为8;
(7){1, 3, 8, 5, 7, 6,9, 2, 0, 8} 因为9>8,所以最右边仍为9;{1, 3, 8, 5, 7, 6,8, 2, 0, 9}
(8){1, 3, 8, 5, 7, 6, 8,2, 0, 9} 因为9>2,所以最右边仍为9;
(9){1, 3, 8, 5, 7, 6, 9, 2,0, 9} 因为9>0,所以最右边仍为9;
6、根据上述内容,引出实现三和实现四(这两种方式严格来说并不是冒泡排序):
void
BubbleSort3(
int
* a,
int
n)
{
for
(
int
i = n - 1; i > 0; i--)
{
for
(
int
j = 0; j < i; j++)
{
if
(a[i] < a[j])
// 升序
{
swap(a[i], a[j]);
}
}
}
}
void
BubbleSort4(
int
* a,
int
n)
{
for
(
int
i = 0; i < n - 1; i++)
{
for
(
int
j = i + 1; j < n; j++)
{
if
(a[i] > a[j])
// 升序
{
swap(a[i], a[j]);