//冒泡的思想(按升序),两个相邻的数进行比较,第一个和第二个比较, 如果第一个比第二个大,就交换顺序,否则不交换。接下来再比较第二个和第三个,仍
//然是如果前者比后者大,就交换顺序。这样依次比较,这样当倒数第二个数和最后一个数比较过后,最后一个数就是这些数里最大的,上述过程称作第一趟冒泡排序。
//按这样的比较规则再比较最后一个数前面的所有数,就能找出倒数第二大的数来。判别排序结束的条件是“在一趟排序过程中没有进行过交换记录的操作”。
// 对数组a[0..n-1]进行起泡排序,使数据从小到大有序
//-------------------------------------
#include <stdio.h>
// 对主函数中调用的函数进行声明// 函数bubble_sort()的声明
void bubble_sort(int a[],int n);
// 顺序打印数组a中的元素 函数声明
void print_out(int a[],int n);
// 起泡排序 主程序
int count = 0;
int main()
{
// 测试数据
int a[]={45,23,67,12,576,97,24,768,12,10};
printf("起泡排序\n");
// 打印排序前的数据
printf("排序前:\n");
print_out(a,10);
// 进行起泡排序
// TODO (#1#): 这里调用bubble_sort()对数组a排序
bubble_sort(a,10);
// 打印排序后的数据
printf("排序后:\n");
print_out(a,10);
printf(" %d",count);
printf("\n");
}
// 函数的实现定义在下面
// 对数组a[0..n-1]进行起泡排序,使数据从小到大有序
void bubble_sort(int a[],int n)
{
// TODO (#1#): 这里定义函数中用到的变量
int i ,j;
int t;
int flag = 1;
for(i=n-1;i>0 && flag == 1;i--)
{
count++;
for(j=0;j<i;j++)
{
flag = 0; //flag为0 说明没变动 一开始就是正确的顺序 所以循环停止
if(a[j]>a[j+1])
{
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
flag = 1; //flag为1 说明有变动 需要继续循环
}
}
}
} // bubble_sort
// 顺序打印数组a中的元素
void print_out(int a[],int n)
{
int i;
for(i=0; i<n; i++)
printf(" %d",a[i]);
printf("\n");
}
这样就能确定最大的一个数,并把最大的一个数挪到最后面,这样的一个过程称之为一趟冒泡排序。最大的数确定了,接下来就是再排最大数之前的数。
第二趟冒泡排序,确定了倒数第二大的数。
第三趟确定了倒数大三的的数。这样依次就能排好序。直到出现 8 10 12 21 34 56 这样再进行冒泡排序 不会进行交换过程 ,flag一直为0,循环不再继续。