当前位置: 首页 > news >正文

cms仿站网站排名快速提升

cms仿站,网站排名快速提升,建造自己的网站,设计logo图标本专栏内容为:八大排序汇总 通过本专栏的深入学习,你可以了解并掌握八大排序以及相关的排序算法。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:八大排序汇总 🚚代码仓库:小小unicorn的代码仓库…

本专栏内容为:八大排序汇总 通过本专栏的深入学习,你可以了解并掌握八大排序以及相关的排序算法。

💓博主csdn个人主页:小小unicorn
⏩专栏分类:八大排序汇总
🚚代码仓库:小小unicorn的代码仓库🚚
🌹🌹🌹关注我带你学习编程知识

无论你学习哪种编程语言,在学到循环和数组时,通常都会介绍一种排序算法来作为例子,而这个算法一般就是冒泡排序。并不是它的名称很好听,而是说这个算法的思路最简单,最容易理解。因此,哪怕大家可能都已经学过冒泡排序了,我们还是从这个算法开始我们的排序之旅

在这里插入图片描述

冒泡排序

  • 最简单排序的实现
  • 冒泡排序算法
  • 冒泡排序优化
  • 冒泡排序复杂度分析

在这里插入图片描述

最简单排序的实现

冒泡排序(Bubble Sort)是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。

冒泡的实现在细节上可以有很多种变化,我们将分别就3种不同的冒泡实现代码,来讲解冒泡排序的思想。这里,我们就先来看看比较容易理解的一段。

注意:排序用到的结构与函数在第一部分:排序的基本概念与分类。我们已经实现。详情请点击:八大排序(一)--------排序的基本概念与分类


//对顺序表L作交换排序(冒泡排序初级版本)
void BubbleSort0(SqList* L)
{int i = 0, j = 0;for (i = 1; i < L->length; i++){for (j = i+1; j <= L->length; j++){if (L ->r[i] > L->r[j]){swap(L, i, j);   //交换L->r[i]与r->[j]}}}
}

这段代码严格意义上说,不算是标准的冒泡排序算法,因为它不满足“两两比较相邻记录”的冒泡排序思想,它更应该是最简单的交换排序而已。它的思路就是让每一个关键字,都和它后面的每一个关键字比较,如果大则交换,这样第一位置的关键字在一次循环后一定变成最小值。

如下图所示,假设我们待排序的关键字序列是{9,1,5,8,3,7,4,6,2}
当i=1时,9与1交换后,在第一位置的1与后面的关键字比较都小,因此它就是最小值。

当i=2时,第二位置先后由9换成5,换成3,换成2,完成了第二小的数字交换。后面的数字变换类似,这里不再介绍。

这应该算是最容易写出的排序代码了,不过这个简单易懂的代码,却是有缺陷的。观察后发现,在排序好1和2的位置后,对其余关键字的排序没有什么帮助(数字3反而还被换到了最后一位)。也就是说,这个算法的效率是非常低的。
在这里插入图片描述

冒泡排序算法

我们来看看正宗的冒泡算法,有没有什么改进的地方。


//对顺序表L作冒泡排序
void BubbleSort(SqList* L)
{int i = 0, j = 0;for (i = 1; i < L->length; i++){for (j = L->length-1; j >= i; j--)    //j从后往前循环{if (L->r[i] > L->r[j+1])          //若前者大于后者{swap(L, i, j+1);   //交换L->r[i]与r->[j+1]的值}}}
}

依然假设我们待排序的关键字序列是{9,1,5,8,3,7,4,6,2}

当i=1时,变量j由8反向循环到1,逐个比较,将较小值交换到前面,直到最后找到最小值放置在了第1的位置。

如下图所示,当i=1,j=8时,我们发现6>2,因此交换了它们的位置,j=7时,4>2,所以交换……直到=2时,因为1<2,所以不交换。j=1时,9>1,交换,最终得到最小值1放置第1的位置。

事实上,在不断循环的过程中,除了将关键字1放到第1的位置,我们还将关键字2从第9位置提到了第3的位置,显然这一算法比前面的要有进步,在上十万条数据的排序过程中,这种差异会体现出来。图中较小的数字如同气泡般慢慢浮到上面,因此就将此算法命名为冒泡算法。
在这里插入图片描述
后面的数字变换就很简单,这里就不在叙述了。

冒泡排序优化

这样的冒泡程序是否还可以优化呢?答案是肯定的。试想一下,如果我们待排序的序列是{2,1,3,4,5,6,7,8,9}也就是说,除了第1和第2的关键字需要交换外,别的都已经是正常的顺序。

当i=1时,交换了2和1,此时序列已经有序,但是算法仍然不依不饶地将i=2~9以及每个循环中的循环都执行了一遍,尽管并没有交换数据,但是之后的大量比较还是大大地多余了,如下图所示。
在这里插入图片描述
当i=2时,我们已经对9与8,8与7,…,3与2作了比较,没有任何数据交换,这就说明此序列已经有序,不需要再继续后面的循环判断工作了。为了实现这个想法,我们需要改进一下代码,增加一个标记变量flag来实现这一算法的改进。

//对顺序表L作冒泡排序(改进版本)
void BubbleSort(SqList* L)
{int i = 0, j = 0;status flag = 1;                          //用flag进行标记for (i = 1; i < L->length && flag; i++)   //若flag为1则有效数据交换{flag = 0;for (j = L->length-1; j >= i; j--)    //j从后往前循环{if (L->r[i] > L->r[j+1])          //若前者大于后者{swap(L, i, j+1);              //交换L->r[i]与r->[j+1]的值flag = 1;                     //如果有数据交换,则flag为1}}}
}

代码改动的关键就是在变量的for循环中,增加了对flag是否为1的判断。

经过这样的改进,冒泡排序在性能上就有了一些提升,可以避免已经有序的情况下的无意义循环判断

冒泡排序复杂度分析

分析一下它的时间复杂度

最好的情况,也就是要排序的表本身就是有序的,那么我们比较次数,根据最后改进的代码,可以推断出就是n-1次的比较,没有数据交换,时间复杂度为O(n)。

最坏的情况,即待排序表是逆序的情况,此时需要比较之 ∑ i = 2 n ( i − 1 ) = 1 + 2 + 3 + … + ( n − 1 ) = n ( n − 1 ) / 2 \sum_{i=2}^n (i-1)=1+2+3+…+(n-1)=n(n-1)/2 i=2n(i1)=1+2+3++(n1)=n(n1)/2次,并作等数量级的记录移动。因此,总的时间复杂度为O(n2)。

http://www.yayakq.cn/news/662731/

相关文章:

  • 北京市建设监理协会官方网站行业网站建设教程
  • 如何快速学成网站开发怎么自己制作一首歌曲
  • 河南网站开发南京中如建设公司
  • 招远网站建设联系电话wordpress 4.9.8主题
  • 专业建站公司设计网站做短链统计优缺点
  • 自助网站建设怎么建设网站制作 需要什么网络技术
  • 局域网 手机网站建设行业报告
  • 网站营销软件可信网站标志
  • 简述网站开发基本流程湖北工程建设信息网
  • 苏州网站建设营销推广网站编程论文
  • 粘合剂东莞网站建设大连招标网
  • 高校网站建设 网站群国有企业管理培训课程
  • 做网站简单还是写程序陕西交通建设集团蓝商分公司网站
  • 网站免费推广的方法图片在线制作网站
  • 江西火电建设公司网站网站设计公司 推荐
  • 做教程网站资源放哪里有太仓广告设计公司网站
  • c 网站模板外贸网络推广怎样做
  • 英文学习网站如何做视频网站技术
  • 县蒙文网站建设汇报快速搭建网站 优帮云
  • 台前网站建设价格群晖wordpress 外网访问
  • 汕尾住房和城乡建设局网站环县网站怎么做
  • 钓鱼网站盗号wordpress仿百度搜索主题
  • 关于做摄影的网站富文本编辑器wordpress
  • 做彩票网站推广专门做五金的网站
  • 怎么仿别人的网站wordpress和typecho编辑器
  • 怎么看公司网站是哪里做的上海网站建设 百家号
  • 深圳做微信网站公司哪家好营销网站建立公司
  • 福州建设网站效果图中国网站空间
  • 网站服务器不稳定商丘网站制作
  • 手机网站引导页js插件西安建设科技专修学院官方网站