冒泡排序--C语言实现

冒泡排序

基本概念

冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。

  由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。

  用二重循环实现,外循环变量设为i,内循环变量设为j。外循环重复9次,内循环依次重复9,8,...,1次。每次进行比较的两个元素都是与内循环j有关的,它们可以分别用a[j]和a[j+1]标识,i的值依次为1,2,...,9,对于每一个i, j的值依次为1,2,...10-i。

产生

  在许多程序设计中,我们需要将一个数列进行排序,以方便统计,而冒泡排序一直由于其简洁的思想方法而倍受青睐。

排序过程

  设想被排序的数组R[1..N]垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上"漂浮",如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。

算法示例

A[0] 、 A[1]、 A[2]、 A[3]、 A[4]、 A[5]、 A[6]:

49 38 65 97 76 13 27

第一趟冒泡排序过程

38 49 65 97 76 13 27

38 49 65 97 76 13 27

38 49 65 97 76 13 27

38 49 65 76 97 13 27

38 49 65 76 13 97 27

38 49 65 76 13 27 97 – 这是第一趟冒泡排序完的结果

第二趟也是重复上面的过程,只不过不需要比较最后那个数97,因为它已经是最大的

38 49 65 13 27 76 97 – 这是结果

第三趟继续重复,但是不需要比较倒数2个数了

38 49 13 27 65 76 97


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void bubble_sort(int v[], int len)
{
int i, j, tmp, is_swp;


for(i = 0; i < len; i++) {
is_swp = 0;
for(j = 0; j < len - i - 1; j++) {
if (v[j] < v[j+1]) {
tmp = v[j + 1];
v[j + 1] = v[j];
v[j] = tmp;
is_swp = 1;
}
}
if (!is_swp) return;
}
}


void main(int argc, char **argv)
{
int value[] = {
50, 33, 66, 72, 72, 11, 29, 45, 93, 26, 17, 49, 63,
};
int i = 0;


printf("排序之前的数据:\n");
for(i = 0; i < sizeof(value)/sizeof(int); i++) {
printf("%4d ", value[i]);
}


bubble_sort(value, sizeof(value)/sizeof(int));

printf("\n");
printf("\n排序之后的数据:\n");
for(i = 0; i < sizeof(value)/sizeof(int); i++) {
printf("%4d ", value[i]);
}


printf("\n");


}


sizeof(value)/sizeof(int)是求数组元素个数

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值