冒泡算法是我接触的第一个算法,我一直觉得,冒泡算法不是很好理解的一个算法……第一次在课堂上至少花了5分钟来理解,也许是十分钟……反正是很长很长的时间,我今天看这算法还是觉得晕……
言归正传,冒泡算法是一种流行的排序算法,它重复地交换相邻的两个反序元素。这句话简直是太含糊了,不过《算法导论》上就是这么写的,来看代码
#include "array_sort.h"
#include "base.h"
/**
* @brief Bubble Sort for array.
*
* Repeatedly swapping adjacent elements that are out of order.
*
* @note Complexity: O(n^2).
* @param array The array need to be sort.
* @param len Length of array.
* @return The sorted array.
*/
int *bubble_sort (int *array, int len)
{
/* array[0, i) for the sorted sequence */
int i, j;
for (i = 0; i < len; i++)
{
for (j = len - 1; j > i; j--)
{
if (array[j] < array[j - 1])
{
swap (&array[j], &array[j - 1]);
}
}
}
return array;
}其中array[0, i)是已经排好序的子数组,array[j, len)是乱序的子数组。
外层循环中,i是当前要选出的第i小的泡泡……这个泡泡是从底部浮上来的,内层循环中,每次都从最后一个元素开始选择,然后依次从[i+ 1, len)这个区间把最小的元素交换到i中……
其实我觉得我根本就没法描述清楚这个算法……而且我发现之前实现的“冒泡排序”其实是一种选择排序……