排序算法-冒泡排序的三种实现

1、最基本版本

冒泡排序是非常容易理解和实现,设数组长度为N,以从小到大排序举例:

1)比较相邻的前后2个数据,如果前面数据大于后面的数据,就将2个数据交换。
2)这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置(也可以是把最小的元素浮到最前面)。
3)N=N-1,如果N不为0就重复前面2步,否则排序完成。

代码见://冒泡排序版本1

2、改进版本一

下面对其进行优化:设置一个标志,如果这一趟发生了交换,则为true,否则为false。显然,如果有一趟没有发生交换,说明排序已经完成。!!!!

代码见://冒泡排序版本2

3、改进版本二

再做进一步的优化。如果有100个数的数组,仅前面10个无序,后面90个都已排好序且都大于前面10个数字,那么在第一趟遍历后,最后发生交换的位置必定小于10,且这个位置之后的数据必定已经有序了,记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。!!!!

代码见://冒泡排序版本3

4、代码

第一种是O(n^2)。第二种和第三种,最好的情况,如所有的数据都已排好序,都是O(n),最坏的情况,如完全的逆序排列,都是O(n^2)。

#include <iostream>
using namespace std;

void print(int a[], int n)
{
    for(int i=0;i<n;i++)
        cout<<a[i]<<" ";
    cout<<endl;
}

//冒泡排序版本1
void BubbleSort1(int a[], int n)
{
    for(int i=0;i<n-1;i++)
    {//只需n-1趟排序
        //(1)从前向后排序,每一趟排序把最大的元素沉到最后面!!!
        //for(int j=1;j<n-i;j++)
        //(2)从后向前排序,每一趟排序把最小的元素浮到最前面!!!
        for(int j=n-1;j>i;j--)
        {//替换为(1)的for(int j=1;j<n-i;j++)也可
            if(a[j] < a[j-1]) swap(a[j],a[j-1]);
        }
    }
}
//冒泡排序版本2
void BubbleSort2(int a[], int n)
{
    bool flag=true;
    int k=n;
    while(flag)
    {//当某一趟有交换时才进行排序,否则排序完成
        flag=false;
        for(int j=1;j<k;j++)
        {//一趟排序
            if(a[j] < a[j-1])
            {
                swap(a[j], a[j-1]);
                flag=true;
            }
        }
        k--;
    }
}
//冒泡排序版本3
void BubbleSort3(int a[], int n)
{
    int flag=n;
    int k;
    while(flag>0)
    {
        k=flag;
        flag=0;
        for(int j=1;j<k;j++)
        {//一趟排序
            if(a[j] < a[j-1])
            {
                swap(a[j], a[j-1]);
                flag=j;//记录下最后交换的位置
            }
        }
    }
}

int main()
{

    int a1[]={6,2,8,3,5,5,20,32,1};
    int a2[]={2,8,5,5,20,32,1,19,2};
    int a3[]={17,5,8,3,88,5,20,32,3};
    int n1=sizeof(a1)/sizeof(a1[0]);
    int n2=sizeof(a2)/sizeof(a2[0]);
    int n3=sizeof(a3)/sizeof(a3[0]);

    BubbleSort1(a1, n1);
    print(a1, n1);
    BubbleSort2(a2, n2);
    print(a2, n2);
    BubbleSort3(a3, n3);
    print(a3, n3);
    return 0;
}

结果:

1 2 3 5 5 6 8 20 32
1 2 2 5 5 8 19 20 32
3 3 5 5 8 17 20 32 88

Process returned 0 (0x0)   execution time : 0.474 s
Press any key to continue.

转载:http://blog.csdn.net/morewindows/article/details/6657829

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值