一.算法思想
方法: 相邻两数比较,若前大后小,则交换 (升序排列)
二.算法实现
n=6个数的排序 | n个数的排序 |
---|---|
需要5趟的扫描(0~4) | 需要n-1趟的扫描(0~n-2) |
第0趟扫描,从a[0]和a[1]比较开始,至a[4]和a[5]比较为止,最大的数保存在a[5]中 | 第0趟扫描,从a[0]和a[1]比较开始,至a[n-2]和a[n-1]比较为止,最大的数保存在a[n-1]中 |
第1趟扫描,从a[0]和a[1]比较开始,至a[3]和a[4]比较为止,最大的数保存在a[4]中 | 第1趟扫描,从a[0]和a[1]比较开始,至a[n-3]和a[n-2]比较为止,最大的数保存在a[n-2]中 |
…… | …… |
…… | 第i趟扫描,从a[0]和a[1]比较开始,至a[n-i-2]和a[n-i-1]比较为止,最大的数保存在a[n-i-1]中 |
…… | …… |
最后1次扫描,a[0]和a[1]比较开始,大值保存在a[1],小值在a[0]中 | 最后1次扫描,a[0]和a[1]比较开始,大值保存在a[1],小值在a[0]中 |
三.算法描述
void bubble_sort(int a[], int n) /自定义冒泡算法函数;
{
int i, j, t; /i,j用于循环计数,t为中间变量;
for (i = 0; i < n - 1; ++i) /有n个数,需要比较n-1次,0~n-2就是n-1次
{
for (j = 0; j < n - 1 - i; ++j) /比较n-1次,再减去i(比较完成的次数)
if (a[j] > a[j + 1]) /比较相邻两数,进行交换;
{
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
四.算法实例
#include <stdio.h>
#define n 10
int main()
{
int i, j, t, a[n] = { 123,5,9,11,33,6,9,76,100,3 };
for (i = 0; i < n - 1; ++i)
{
for (j = 0; j < n - 1 - i; ++j)
{
if (a[j] > a[j + 1])
{
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
for (i = 0; i < n; ++i)
{
printf("%d ", a[i]);
}
return 0;
}
运行结果:
3 5 6 9 9 11 33 76 100 123
#include <stdio.h>
void bubble_sort(char a[], int n);
int main()
{
int i;
char d[10] = { 'a','r','v', 'p','o','m','e','t','u','c' };
bubble_sort(d, 10);
for (i = 0; i < 10; i++)
printf("%c ", d[i]);
return 0;
}
void bubble_sort(char a[], int n)
{
int i, j;
char t;
for (j = 0; j < n - 1; j++)
{
for (i = 0; i < n - j - 1; i++)
{
if (a[i] > a[i + 1])
{
t = a[i];
a[i] = a[i + 1];
a[i + 1] = t;
}
}
}
}
运行结果:
a c e m o p r t u v