C语言_排序算法_冒泡排序法和改进的冒泡排序法

一. 原始的冒泡排序法

  • 1.基本原理
    从下标为0的元素开始,循环比较相邻两个元素a[j]和a[j+1]的大小,每次比较如果前面的元素a[j]都大于后面的元素a[j+1],则交换这两个元素的值。
  • 2.执行过程
    第一轮:a[0]到a[n-1],依次比较前后两个数的大小,循环n-1次后n个数据就被换到了a[n-1]的位置;
    第二轮:a[0]到a[n-2],依次比较前后两个数的大小,循环n-2次后n个数据就被换 到了a[n-2]的位置;
    依次重复以上过程n-1轮,则n个数据就从小到大排序好了!

具体代码如下所示:

 //原始冒泡法
 //缺点:对已经排好的数据仍要进行冒泡操作,尽管没有任何数据交换操作 
 #include<stdio.h>
 #define N 10
 int main()
 {
    
    
  int a[N],i,j,t;
  printf("input %d numbers:\n",N); 
  for(i=0;i<N;i++)          //输入N个数字存放入数组中 
  scanf("%d",&a[i]);
  
   for(i=0;i<N-1;i++)    //N个数共需进行N-1轮 
   for(j=0;j<N-i-1;j++)  //第i轮需要比较N-i-1次 
   {
    
    
    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; 
 } 

二. 改进后的冒泡排序法

  • 1.基本原理
    改进后的冒泡法和原始冒泡法的基本原理一致,不同的是改进后的冒泡排序法弥补了原始冒泡法的缺点,加入了一个标志量(flag),以此来提高程序的运行效率。

具体代码如下所示:

 //冒泡法改进 
 //设置标志量flag 
 #include<stdio.h> 
 #define N 10
 int main()
 {
    
    
  int a[N],i,j,t,flag;      //引入标志量flag 
  printf("input %d numbers:\n",N); 
    for(i=0;i<N;i++)          //输入N个数字存放入数组中 
    scanf("%d",&a[i]);
   for(i=0;i<N-1;i++)    //N个数共需进行N-1轮 
   {
    
    
      flag=0;               //flag开始赋值为0 
      for(j=0;j<N-i-1;j++)  //第i轮需要比较N-i-1次 
      {
    
    
          if(a[j]>a[j+1])   //若前面一个元素大于后面一个元素,则交换 
       {
    
    
          t=a[j];
          a[j]=a[j+1];
          a[j+1]=t;
          flag=1;       //若进行了数据交换,则flag赋值为1 
       }
     }
   if(flag==0) break;  //如果没有进行数据交换,则结束排序 
   } 
  for(i=0;i<N;i++)         //输出排序后的数组 
  printf("%d ",a[i]);
  return 0; 
 }

猜你喜欢

转载自blog.csdn.net/qq_51366851/article/details/112986574