冒泡排序法的改进

1)冒泡法思想:将相邻两个数比较,将小的调到前头。
排序过程:( n=10 )
(1) 比较第一个数与第二个数,若为逆序即a[0]>a[1],则交换;然后比较第二个数与第三个数;依次类推,直至第n-1个数和第n个数比较为止——第一趟冒泡排序。
—结果:最大数放在最后1个位置–a[n-1]。
(2) 对前n-1个数进行第二趟冒泡排序:若为逆序即a[0]>a[1],则交换;然后比较第二个数与第三个数;依次类推,直至第n-2个数和第n-1个数比较为止——第二趟冒泡排序。
—结果:次大数放在第n-1个位置–a[n-2]。
(3) 对前n-2个数进行第三趟冒泡排序:若为逆序即a[0]>a[1],则交换;然后比较第二个数与第三个数;依次类推,直至第n-3个数和第n-2个数比较为止——第三趟冒泡排序。
—结果:次次大数放在第n-2个位置—a[n-3]。
…………………………………………………
重复上述过程,共经过n-1趟冒泡排序后,排序完成。
注意:外循环i=1—(n-1) //n-1趟冒泡
内循环j=0—(n-1-i) //每一趟的下标是从0 到 n-1-i
a[j]与a[j+1]比较
2 思想

  #include //冒泡排序--从小到大
     #define  N   10
     int  main( )
     {   int a[N], i, j, t;
         for  (i = 0; i < N; i++)  //输入N个整数
                scanf ("%d", &a[i]);
         for  (i = 1; i < N; i++)    // 共N-1趟冒泡
              {  for  (j = 0; j < =N -1-i ; j++)  //实现一趟冒泡操作
                        if  (a[j] > a[j+1])   //交换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)改进方法
 冒泡排序--改进(阅读理解)
1)当一次冒泡过程中发现没有交换操作时,表明序列已经排好序了,便终止冒泡操作。
2)标志变量 f:标记在比较过程中是否发生了数据交换。
3)在每趟比较前(外循环内),把 f 置为0,如果在这趟比较过程中发生了交换,将变量 f 置为14)在一趟比较结束后判断:
    如果 f 变量取值为 0,结束排序过程。
    否则进行下一趟排序。 

 )4改进代码

#include  //改进冒泡排序--从小到大
#define  N   10
int main ( )
{  int a[N], i, j, t, f;
   for (i = 0; i < N; i++)       //输入N个整数
        scanf ("%d", &a[i]);
  for (i = 1; i < N; i++)       // 共N-1次
     {  f = 0;   //标记是否发生交换
         for (j = 0; j <= N- 1-i ; j++)  //实现一趟冒泡操作
             if (a[j] > a[j+1])        //交换a[j]和a[j+1]
                { t = a[j];   a[j] = a[j+1];  a[j+1] = t;  f = 1; }
         if ( f == 0)  break; //  不需要再比较,排序结束
     }
  for (i = 0; i < N; i++) //输出排好数据
       printf ("%d ", a[i]);
  return 0; 
}
  
     

你可能感兴趣的:(知识整理)