冒泡排序法

83 篇文章 2 订阅
10 篇文章 0 订阅

算法原理

冒泡 排序 的 方法 为: 将被 排序 的 记录 数组 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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值