C语言的冒泡排序

冒泡排序算法的运作如下:(从后往前)

1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。

2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

3.针对所有的元素重复以上的步骤,除了最后一个。

4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。

用二重循环实现,外循环变量设为i,内循环变量设为j。假如有10个数需要进行排序,则外循环重复9次,内循环依次重复9,8,…,1次。每次进行比较的两个元素都是与内循环j有关的,它们可以分别用a[j]和a[j+1]标识,i的值依次为1,2,…,9,对于每一个i,j的值依次为1,2,…10-i。
测试代码如下:

#include <stdio.h>
#define  N  10 

int main()
{
   static int a[N] ; 
   int i,j,t;
   for(i=0;i<N;i++)
   {
       scanf("%d",&a[i]);
   }
   printf("\n");
   for(i=0;i<N;i++)
   {
       printf("%-4d",a[i]);
   }
   printf("\n");
   for(i=0;i<N-1;i++) // 需要排序的次数,有N个数,需要排序N-1次  
   {
       for(j=0;j<N-1-i;j++) // 每一次排序需要比较的次数 N个数需要比较N-1次  
       {
           if(a[j] > a[j+1]) 
           {
               t = a[j] ; 
               a[j] = a[j+1]; 
               a[j+1] = t;
           }
           
       }
   }
   printf("冒泡排序(从小到大):");
   for(i=0;i<N;i++)
   {
       printf("%-4d",a[i]);
   }
   printf("\n");



   for(i=0;i<N-1;i++) // 需要排序的次数,有N个数,需要排序N-1次  
   {
       for(j=0;j<N-1-i;j++) // 每一次排序需要比较的次数 N个数需要比较N-1次  
       {
           if(a[j] < a[j+1]) 
           {
               t = a[j] ; 
               a[j] = a[j+1]; 
               a[j+1] = t;
           }
           
       }
   }
   printf("冒泡排序(从大到小):");
   for(i=0;i<N;i++)
   {
       printf("%-4d",a[i]);
   }
   printf("\n");

   return 0;
}

这个是普通版本的冒泡排序,然后下来使用C语言指针做的冒泡排序,实验代码如下:

#include <stdio.h>
#define  N  10 

int main()
{
    static int a[N] ; 
    int *p = a;
    int i,j,t;
    for(i=0;i<N;i++)
    {
        scanf("%d",p+i);
    }
    printf("\n");
    for(i=0;i<N;i++)
    {
        printf("%-4d",*(a+i));
    }
    printf("\n");
    for(i=0;i<N-1;i++) // 需要排序的次数,有N个数,需要排序N-1次  
    {
        for(j=0;j<N-1-i;j++) // 每一次排序需要比较的次数 N个数需要比较N-1次  
        {
            if(*(p+j) > *(p+j+1)) 
            {
                t = p[j] ; 
                p[j] = p[j+1]; 
                p[j+1] = t;
            }
            
        }
    }
    printf("冒泡排序(从小到大):");
    for(i=0;i<N;i++)
    {
        printf("%-4d",p[i]);
    }
    printf("\n");



    for(i=0;i<N-1;i++) // 需要排序的次数,有N个数,需要排序N-1次  
    {
        for(j=0;j<N-1-i;j++) // 每一次排序需要比较的次数 N个数需要比较N-1次  
        {
            if(a[j] < a[j+1]) 
            {
                t = a[j] ; 
                a[j] = a[j+1]; 
                a[j+1] = t;
            }
            
        }
    }
    printf("冒泡排序(从大到小):");
    for(i=0;i<N;i++)
    {
        printf("%-4d",a[i]);
    }
    printf("\n");

    return 0;
}

最后还有一版优化的冒泡选择排序:

#include <stdio.h>
#define  N  10 

int main()
{
    static int a[N] ; 
    int i,j,t,min;
    for(i=0;i<N;i++)
    {
        scanf("%d",&a[i]);
    }
    printf("\n");
    for(i=0;i<N;i++)
    {
        printf("%-4d",a[i]);
    }
    printf("\n");


    for(i=0;i<N-1;i++) // 排序的次数, N个数需要N-1次排序  
    {
//        min = i ; 
        for(j=0,min=0;j<N-1-i;j++) //每一次排序需要比较的次数, N个数需要比较N-1次
        {
            if(a[min] > a[j+1] )
            {
                min = j+1; 
            }
        }
        t = a[N-1-i] ; 
        a[N-1-i] = a[min] ; 
        a[min] = t; 
    }

    printf("选择排序优化版:");
    for(i=0;i<N;i++)
    {
        printf("%-4d",a[i]);
    }
    printf("\n");
    return 0;
}

大家要在实际应用中具体使用,需要灵活应用。
------领卓教育

猜你喜欢

转载自blog.csdn.net/qq_39214015/article/details/83345790