//冒泡的思想(按升序),两个相邻的数进行比较,第一个和第二个比较, 如果第一个比第二个大,就交换顺序,否则不交换。接下来再比较第二个和第三个,仍 //然是如果前者比后者大,就交换顺序。这样依次比较,这样当倒数第二个数和最后一个数比较过后,最后一个数就是这些数里最大的,上述过程称作第一趟冒泡排序。 //按这样的比较规则再比较最后一个数前面的所有数,就能找出倒数第二大的数来。判别排序结束的条件是“在一趟排序过程中没有进行过交换记录的操作”。
// 对数组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,循环不再继续。