算法原理
冒泡 排序 的 方法 为: 将被 排序 的 记录 数组 A[ 1... n] 垂直 排列, 每个 记录 A[ i] 看作 重量 为 A[ i] 气泡。 根据 轻 气泡 不 能在 重 气泡 之下 的 原则, 从下 往上 扫描 数组 A: 凡 扫描 到 违反 本 原则 的 轻 气泡, 就 使其 向上“ 飘浮”。 如此 反复 进行, 直到 最后 任何 两个 气泡 都是 轻者 在上、 重者 在下 为止。 冒泡 排序 是 稳定 的 排序。
下面 是 具体 的 算法。
(1) 初始 状态 下, A[ 1… n] 为 无序 区。
(2) 第一 趟 扫描: 从 无序 区 底部 向上 依次 比较 相邻 的 两个 气泡 的 重量, 若 发现 轻者 在下、 重者 在上, 则 交换 二者 的 位置。 即 依次 比较( A[ n], A[ n- 1]),( A[ n- 1], A[ n- 2]),…,;( A[ 2], A[ 1]); 对于 每 对 气泡( A[ j+ 1], A[ j]), 若 A[ j+ 1]< A[ j], 则 交换 A[ j+ 1] 和 A[ j] 的 内容。 第一 趟 扫描 完毕 时,“ 最轻” 的 气泡 就 飘浮 到 该区 间的 顶部, 即 关键字 最小 的 记录 被 放在 最高 位置 A[ 1] 上。
(3) 第二 趟 扫描: 扫描 A[ 2… n]。 扫描 完毕 时,“ 次 轻” 的 气泡 飘浮 到 A[ 2] 的 位置 上。
(4) 第 i 趟 扫描: A[ 1... i- 1] 和 A[ i… n] 分别为 当前 的 有序 区 和 无序 区。 扫描 仍是 从 无序 区 底部 向上, 直至 该区 顶部。 扫描 完毕 时, 该区 中最 轻 气泡 飘浮 到顶 部 位置 A[ i] 上, 结果是 A[ 1... i] 变为 新的 有序 区。 最后, 经过 n- 1 趟 扫描 可得到 有序 区 A[ 1... n]。
算法笔记:
代码实现
#include <stdio.h>
#include <stdlib.h>
#define SUCCESS 0
#define PARAM_ERR -1
int BubbleSort(int * array, int size){
if(NULL == array){
printf("%s para error", __func__);
return PARAM_ERR;
}
int i = 0, j = 0;
int temp = 0;
int xch = 0;
#ifdef DEBUG
int k = 0;
#endif
for(i = 0; i < size; i++){ /*逐步扩大有序区域*/
xch = 0; /*记录是否发生过交换*/
for(j = i + 1; j < size; j++){ /*逐个比较交换无序区域*/
/* 升序,小的上浮 */
if(array[j] < array[i]){
temp = array[i];
array[i] = array[j];
array[j] = temp;
xch = 1;
}
}
#ifdef DEBUG
printf("[");
/*有序区域*/
for(k =0; k < i; k++){
printf(" %d ", array[k]);
}
printf("], ");
printf(" %d, ",array[i]);
/*无序区域*/
printf("[");
for(k =i+1; k < size; k++){
printf(" %d ", array[k]);
}
printf("]\n");
printf("\n");
#endif
/*无序区域完全没有发生交换,说明已经完全排序好了,退出*/
if(1 != xch){
break;
}
}
return SUCCESS;
}
int main(int argc, char ** argv){
int array[10] = {7,3,5,8,0,9,1,2,4,6};
int i = 0;
printf("Before sort: \n");
for(i = 0; i < 10; i++){
printf(" %d ", array[i]);
}
printf("\n");
BubbleSort(array, 10);
printf("after sort: \n");
for(i = 0; i < 10; i++){
printf(" %d ", array[i]);
}
printf("\n");
return 0;
}
调试编译
gcc BubbleSort.c -DDEBUG
调试输出
Before sort:
7 3 5 8 0 9 1 2 4 6
[], 0, [ 7 5 8 3 9 1 2 4 6 ]
[ 0 ], 1, [ 7 8 5 9 3 2 4 6 ]
[ 0 1 ], 2, [ 8 7 9 5 3 4 6 ]
[ 0 1 2 ], 3, [ 8 9 7 5 4 6 ]
[ 0 1 2 3 ], 4, [ 9 8 7 5 6 ]
[ 0 1 2 3 4 ], 5, [ 9 8 7 6 ]
[ 0 1 2 3 4 5 ], 6, [ 9 8 7 ]
[ 0 1 2 3 4 5 6 ], 7, [ 9 8 ]
[ 0 1 2 3 4 5 6 7 ], 8, [ 9 ]
[ 0 1 2 3 4 5 6 7 8 ], 9, []
after sort:
0 1 2 3 4 5 6 7 8 9