排序算法之——冒泡排序

1.算法思想(参考:https://www.cnblogs.com/nicaicai/p/12549959.html)

 通过对待排序的序列从前向后依次比较相邻元素的值,如果发现逆序则交换。
逆序的含义:如果想把序列从小到大排序,那么两个数中前面的比后面的大就是逆序。
若需求是将序列从小到大排序,那么每一趟比较都会把值较大的逐渐从前面移动到后面。

2.冒泡排序的C语言实现

(1)排序的总趟数和每趟排序数组元素的比较次数都设置为数组大小n-1,排序的比较次数为(n-1)*(n-1)次

//冒泡排序 
#include <stdio.h>
int main()
{
    //定义一个整型数组
    int a[]={9,8,3,5,2,10,7}; 
    int i,j,n;
    //整个数组的大小除以第一个数组元素的大小 ,得到数组的长度 
    n=sizeof(a)/sizeof(a[0]); 
    //排序前的数组
     printf("排序前:");
     for(i=0;i<n;i++)
     {
         printf("a[%d]=%d ",i,a[i]);
     } 
     for(i=0;i<n-1;i++)  //排序的总趟数,等于数组大小-1 
     {
         for(j=0;j<n-1;j++)   //每一趟数组元素的比较次数 
        {
             /*如果前一个数组元素比之后一个数组元素大,则交换它们的位置*/
             if(a[j]>a[j+1]) 
             {
                 int temp;
                 temp=a[j];
                 a[j]=a[j+1];
                 a[j+1]=temp;    
             }
        } 
     }
     printf("
");
    //排序后的数组
    printf("排序后:");
     for(i=0;i<n;i++)
     {
         printf("a[%d]=%d ",i,a[i]);
     } 
    return 0;
}

运行结果:

(2)改进的冒泡排序算法,每趟排序的总比较次数依次减1,已经排序好的数组元素不再参与每趟排序的比较,最坏的情况下比较次数为n-1+n-2.........+1=n*(n-1)/2次。

//冒泡排序 
#include <stdio.h>
int main()
{
    //定义一个整型数组
    int a[]={9,8,3,5,2}; 
    int i,j; 
    //排序前的数组
     printf("排序前:");
     for(i=0;i<5;i++)
     {
         printf("a[%d]=%d ",i,a[i]);
     } 
     for(i=0;i<5-1;i++)  //排序的总趟数,等于数组大小-1 
     {
         for(j=0;j<5-1-i;j++)   //每一趟数组元素的比较次数 
        {
             if(a[j]>a[j+1])
             {
                 int temp;
                 temp=a[j];
                 a[j]=a[j+1];
                 a[j+1]=temp;    
             }
        } 
     }
     printf("
");
    //排序后的数组
    printf("排序后:");
     for(i=0;i<5;i++)
     {
         printf("a[%d]=%d ",i,a[i]);
     } 
    return 0;
}

运行结果:

参考文章:

http://c.biancheng.net/view/6506.html

https://www.cnblogs.com/nicaicai/p/12549959.html

转载文章链接已标明,如有侵权请告知。文章仅作为知识记忆所用,如有错误,敬请指正。
原文地址:https://www.cnblogs.com/YorkZhangYang/p/13983550.html