- 用flag标记是否发生了交换,如果没有交换就提前结束
#include<stdio.h> int main ( ) { int i,j,t,n,flag; scanf("%d",&n); int a[100]; for ( i = 0 ; i < n ; i ++ ) { scanf("%d",&a[i]); } for ( i = 0 ; i < n ; i ++ ) { flag = 0 ; for ( j = 0 ; j < n - i - 1 ; j ++ ) { if ( a[j] > a[ j + 1 ] ) { flag = 1 ;//标记如果交换了就赋为1 t = a[j] ; a[j] = a[ j + 1 ] ; a[ j + 1 ] = t ; } } if ( flag == 0 ) { //如果flag = 0 说明没有交换就跳出循环 break ; } } for ( i = 0 ; i < n ; i ++ ) { printf("%d ",a[i]); } return 0 ; }
- 记录最后发生交换的位置,作为下一趟比较结束的位置
#include<stdio.h> int main ( ) { int i,j,t,k,n; scanf("%d",&n); int a[100]; int flag = n - 1 ; //flag 记为最后的位置 for ( i = 0 ; i < n ; i ++ ) { scanf("%d",&a[i]); } for ( i = 0 ; i < flag ; i ++ ) { k = flag ; // 把flag的值赋给k flag = 0 ; for ( j = 0 ; j < k ; j ++ ) { if ( a[j] > a[ j + 1 ] ) { flag = j ; //如果发生交换 就把j的值赋给flag 下次比较的时候就不用循环到最后 因为后面的数已经排完序 t = a[j] ; a[j] = a[ j + 1 ] ; a[ j + 1 ] = t ; } } } for ( i = 0 ; i < n ; i ++ ) { printf("%d ",a[i]); } return 0 ; }
冒泡排序的优化
最新推荐文章于 2020-10-26 16:59:14 发布