冒泡排序

双向冒泡排序 冒泡排序 性能对比 双向冒泡排序 冒泡排序 性能对比 数据结构与算法与语言无关,此篇博文用的描述语言是go 冒泡排序 冒泡排序的时间复杂度是O(n2) 先看一个简单的冒泡排序 //普通冒泡排序 func normalBubbleSort(sequence []int){ for i := 0;i < len(sequence) - 1;i++ { for j := 0;... 阅读详情

冒泡排序可以说是最简单的一种排序了,其核心思想是:
* 每次比较相邻的两个数,若后面的比前面大,则交换之;
* 重复以上步骤,直到所有数都有序为止。

代码如下:

template<typename T>
void BubbleSort(vector<T>& v)
{
    int length=v.size();
    int i,j;
    for(i=0;i<length;++i)
    {
        for(j=0;j<length-1;++j)
        {
            if(1==compair(v[j],v[j+1]))
            {
                std::swap(v[j],v[j+1]);
            }
        }
    }
}

可以看出,冒泡排序采用了比较相邻数字的做法,所以时间复杂度为O(n2)。事实上,所有基于位置的比较排序的时间复杂度都逃不了O(n2)的厄运。

我们来看看以上代码还有没有什么可以优化的地方。

改进一:如果一趟排序中没有发生交换,则表明排序已经完成。
代码如下:

template<typename T>
void BubbleSort(vector<T>& v)
{
    bool flag=true;
    int length=v.size();
    int i,j;
    for(i=0;i<length;++i)
    {
        flag=true;
        for(j=0;j<length-1;++j)
        {
            if(1==compair(v[j],v[j+1]))
            {
                flag=false;
                std::swap(v[j],v[j+1]);
            }
        }
        if(flag==true)
            break;
    }
}

改进二:每一趟排序,都可将一个当前序列中最大的值”冒泡”到最后面,所以下一次只需要进行到这里就可以结束了。
代码如下:

template<typename T>
void BubbleSort(vector<T>& v)
{
    int length=v.size();
    int i,j;
    for(i=0;i<length;++i)
    {
        for(j=0;j<length-i-1;++j)
        {
            if(1==compair(v[j],v[j+1]))
            {
                std::swap(v[j],v[j+1]);
            }
        }
    }
}

值得注意的是,以上虽然对代码做了一些优化,但冒泡排序的算法的时间复杂度在本质上是没有改变的,仍然是2的平方阶。

以上

如果你有任何想法或是可以改进的地方,欢迎和我交流!

完整代码及测试用例在github上:点我前往

本文首发于www.sbrave.cn

【完】

冒泡排序与链表的冒泡排序 首先看一看简单的冒泡排序是如何实现的: #include <stdio.h> int main() { int a[100],n; printf("请输入数组元素个数:\n"); scanf("%d",&n); printf("请输入数组元素:\n"); for(int k=0;k<n;k++) scanf("%d",&a[k]); /*冒泡排序*/ for(int i=0;i<(n-1);i++) //对于n个数,只需进行n-1次循环排序 f 阅读详情

相关推荐

单链表冒泡排序与数组冒泡排序

冒泡排序冒泡排序是最基本也是最简单的一种排序,但是复杂度高不适合大数据的排序, 但是对于我们学习排序还是很有帮助的。冒泡排序的思想就是每遍历一次就选出最大值或最小值,类似水中的水泡一样,越到水面泡越大。 下面的链表基于这种定义:http://blog.youkuaiyun.com/dawn_after_dark/article/details/73610674形式一冒泡排序其实有好几种变形,原始的思想就是每一

dawn_after_dark的博客 1899

C语言冒泡排序

冒泡排序?不难,这篇就够了! for(int i=0;i

小S的博客 9万+

S7-200SMART PLC实现冒泡排序的具体方法和程序示例

S7-200SMART PLC实现冒泡排序的具体方法和程序示例

Robot_PLC_HMI_Automation 4716

冒泡排序和双向冒泡排序算法

冒泡排序算法应该算是每个开发者入门必学的基础算法,它逻辑清晰简单,代码实现也并不复杂,这里用自己的话语来总结一下。 (这些为了方便随便打开了一个node项目写的,其他Java ,PHP,C等也是一样的道理,算法讲究的只是一个思维模式,知道怎么去实现就行,不要死抠语言) 先说简单的普通冒泡排序: 冒泡排序既然是一个排序算法,那么它就一定是有一个循环排序的过程,其实它的原理很简单,就是两层for循环嵌...

whiteBearClimb的博客 2915

S7-200SMART PLC利用间接寻址实现冒泡排序并制作可重复调用的库文件

S7-200SMART PLC利用间接寻址实现冒泡排序并制作可重复调用的库文件

Robot_PLC_HMI_Automation 2989

S7-200SMART冒泡排序源程序及库文件(可重复调用).rar

S7-200SMART冒泡排序源程序及库文件(可重复调用)

冒泡排序详解

一、冒泡排序介绍 冒泡排序是一种基于比较和交换操作的排序算法。 每轮冒泡的过程都是从第一个元素开始,将该元素和相邻下一个元素进行比较和交换,使得较大的元素向右移动(如果该元素大于下一个元素,则两个元素交换;如果该元素小于等于下一个元素,则保持不变)。这样一来,每轮冒泡的过程都可以确定一个元素放在正确的位置上,而这个元素就是剩余元素中最大的元素,正确的位置就是剩余位置中的最右侧的位置。这个过程就像是...

学而时‘享’之,乐乎 1841

S7-200SMART PLC实现冒泡排序的具体方法和程序示例.docx

S7-200SMART PLC实现冒泡排序的具体方法和程序示例

【冒泡排序】c++实现冒泡排序代码

【冒泡排序】c++实现冒泡排序代码 冒泡排序的基本思想: 冒泡排序的核心是对所有相邻数组元素的值进行比较,如果是逆序(a[i]>a[i+1]),则两者交换,最终达到有序。 步骤: (1)比较第一个数a[0]和第二个数a[1],如果a[0]>a[1],则,两个数组元素的值交换;然后接着比较第二个数a[1]和第三个数a[2],以此类推,直到第n-1个数a[n-1]与第n个数a[n]比较为止。这个过程是第一趟冒泡排序,其结果是将数组中最大的值放到了最后一个位置上。 (2)第二趟冒泡排序,是对前n-1个

qq_39543174的博客 1万+

S7-200SMART冒泡排序-优化版(可选择升序降序及数据类型等).zip

S7-200SMART冒泡排序-优化版(可选择升序降序及数据类型等)

S7-200SMART-库文件2024(平均值+冒泡排序+搜索大小值等例程+说明书).rar

S7-200SMART-库文件2024(平均值+冒泡排序+搜索大小值等例程+说明书)

冒泡排序和双向冒泡排序 —— 前端 js 版

冒泡排序和双向冒泡排序 js版冒泡排序冒泡排序理解冒泡排序实现冒泡排序优化双向冒泡排序双向冒泡代码实现 冒泡排序 冒泡排序理解 冒泡排序是基础的排序算法之一,效率非常低,但作为一名前端开发,掌握它还是必不可少的技能。 冒泡排序是将相邻两个元素进行比较,根据条件进行调换位置达到排序的目的。 冒泡排序实现 本例最大的数字放在了最右边,则下次遍历可少比较一次最右边的,本次需比较的次数:数组最大索引值 - 1(因为要比较 j + 1, j + 1 需小于等于数组最大索引值)- 遍历的次数 在力扣上通过排序测试时间

hulingyua的博客 1391

S7-200SMART间接寻址实现冒泡排序并制作可重复调用的库文件.docx

S7-200SMART PLC利用间接寻址实现冒泡排序并制作可重复调用的库文件

冒泡排序总结

冒泡排序总结算法思想:图片演示代码冒泡排序常规版:冒泡排序优化第一版冒泡排序优化第二版 算法思想: 冒泡排序是一种交换排序。 交换排序就是通过元素按照要求进行两两比较,判断是否符合要求,假如不符合要求就将两个元素交换位置来达到排序的目的。 冒泡排序名字的由来就是因为在交换过程中,类似水冒泡,小(大)的元素经过不断的比较交换由水底慢慢的浮到水的顶端。 冒泡排序的思想就是利用的比较交换,利用循环将第 i 小或者大的元素归位,归位操作利用的是对 n 个元素中相邻的两个进行比较,如果顺序正确就不交换,如果顺序错误就

qq_41825377的博客 2328

TIA博途中实现冒泡排序的两种SCL语言算法.docx

TIA博途中实现冒泡排序的两种SCL语言算法

Matlab结果性能评价---rms函数(计算矩阵、数组和向量元素均方根)

实例1:创建一个向量(正弦波)并计算其均方根值 实例2:创建一个二维矩阵并计算其均方根值 实例3:计算二维矩阵沿指定维度的均方根值 本例程配套完整源码下载 均方根(Root-Mean-Square Level): 向量x的均方根值为沿着指定的维度执行求和: 语法描述: y = rms(x)返回输入x的均方根值。如果x是行或列向量,y是实数值标量。对于大小尺寸大于1矩阵x,y包含沿x的第一个数组维度计算的均方根值。例如,如果x是N > 1的N*M矩阵,那么y是1*M行向量,对应x矩..

qq_32809093的博客 3万+
上一篇: 选择排序
下一篇: 一个简单的AVL树实现
SmartBrave
博客等级 码龄12年 25粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值