每日一算法--》冒泡排序

先来段基本知识,百度来的:

冒泡排序定义:

它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端,故名。

 

冒泡排序算法的运作如下:

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

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

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

  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

分析:

1.最坏时间复杂度:n的平方;

2.最好的时间复杂度:n;

3.平均时间复杂度:n的平方;

4.比较稳定的;

5.属于交换排序(冒泡排序和快速排序)。

 

先来段简单的程序:

#include<stdio.h>

void bubbleSort(int a[],int n)
{
    int i,j,t;
    for(i=0;i<n;i++)
    {
        for(j=i+1;j<n;j++)
        {
            if(a[i]<a[j])
            {
                a[i]=a[i]+a[j];
                a[j]=a[i]-a[j];
                a[i]=a[i]-a[j];
            }
        }
    }
}
 
void print(int a[],int n)    //打印数组 
{
    int i=0;
    for(;i<n;i++)
    {
        printf("%d  ",a[i]);
    }
    printf("\n");
}

int main()
{
    int a[]={49,15,52,64,98};    //测试数据 
    print(a,5);
    bubbleSort(a,5);
    print(a,5);
    return 0;
}

 

改进版:

 

如果已经有序的增加一个标志位,来看第i个后如果有序就会完成,下次就不会排序了!

#include<stdio.h>

void bubbleSort(int a[],int n)
{
    int s=0; 
    int i,j,t;
    for(i=0;i<n;i++)
    {
        for(j=i+1;j<n;j++)
        {
            if(a[i]<a[j])
            {
                a[i]=a[i]+a[j];
                a[j]=a[i]-a[j];
                a[i]=a[i]-a[j];
                s=1;
            }
        }
        if(s==0)
        {
            return;
        }
    }
}
 
void print(int a[],int n)    //打印数组 
{
    int i=0;
    for(;i<n;i++)
    {
        printf("%d  ",a[i]);
    }
    printf("\n");
}
int main()
{
    int a[]={49,15,52,64,98};    //测试数据 
    print(a,5);
    bubbleSort(a,5);
    print(a,5);
    return 0;
}
posted @ 2013-05-15 22:59  Life Is This  阅读(156)  评论(0编辑  收藏  举报