大话数据结构--排序算法

前言

这段时间阅读大话数据结构这本书的排序算法章节,对其中提到的额几个算法,交换排序、冒泡排序、选择排序、插入排序、希尔排序、堆排序、归并排序、快速排序等算法进行了巩固,也把该过程中的一些理解,介绍给大家。

一、冒泡排序

1.1、 最简单的冒泡排序算法  --交换排序

 

交换排序算法,就是对集合进行循环,依次从第一个位置开始,与后面的所有数比较,如果后者小于前者,则交换两者的位置,算法的实现如下:

 

第一个for 循环,表示对所有元素循环,第二这个元素,表示i位置元素后面的所有元素,每执行执行,都判断一下,i,j 位置元素的值,如果i位置,大于j位置,则交换两个元素的值。

该算法的效率较低;

1.2、冒泡排序算法

每次循环把最小值都排在最上面,

 

 

1.3、 改进的冒泡排序算法

 

针对这样的序列,本来用一次循环,就能将序列排序完成,可是,按照以前的程序,他还是要把所有的位置都比较一下,浪费了时间,因此引进了一个标志参数,如果序列为有序了,则标志为false,则不用再进行后面的比较了。

 

 

 

冒泡排序的时间复杂度为  1+2+3+4 +…+(n-1)=n*(n-1)/2  所以时间复杂度为O(n2)

二 、简单选择排序

 

 

该排序的原理,是,改进了冒泡排序中需要不停的交换元素操作的特点,每次比较之后,只是记录下这次比较中最小值得位置,如果,值小于最小值,则将这个值得位置记录下来,比较玩一次循环后,在判断是否需要交换。

算法实现如下:

选择排序时间复杂度上分析:

对于比较次数而言  1+2+3+4….+(n-1)=n*(n-1)/2  ,还是 O(n2)

但是对于交换次数,最少可能为0  ,最大为 n-1  ,所以该算法总体而言比冒泡排序还是要好。

 

三 、直接插入排序

 

 

排序的原理,是将一个记录插入到已经排序好的集合中。

 

 

时间复杂度:也是O(n2) 但性能上比冒泡排序和选择排序要好

 

四、希尔排序

 

进行分组跳跃式的排序,让每个分组达到基本有序,最后进行一次全部数据的插入排序,

 

具体的代码实现如下

 

 

时间复杂度:O(N3/2)

 

五、堆排序

堆排序,

堆是具有下列性质的二叉树,每个节点的值都大于或等于其左右孩子节点的值,称为大顶堆。或者每个节点的值都小于或等于其左右节点的值,叫小顶堆。

结合二叉树的相关性质,堆排序就是利用堆进行排序的方法。他的基本思想是,将待排序的序列构造成一个大顶堆。,此时,整个系列的最大值就是堆顶的根节点。将其移动到数组的末尾元素,此时末尾元素就是最大值。然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的次小值。如此反复执行,得到一个有序序列。

 

算法实现

 

 

时间复杂度:O(nlogn)

六、归并排序

 

归并排序 就是利用归并的思想实现的排序算法。他的原理是假设初始序列含义n个记录,则可以看成是n个有序的子序列。每个子序列的长度为1,然后两两归并,得到[n/2]个长度为2或1的有序子序列;再两两归并,反复执行。直到得到一个长度为n的有序序列为止,这种排序方法称为2路归并排序。

 

算法程序

 

时间复杂度:O(nlogn)

七、快速排序算法

快速排序其实就是前面说的冒泡排序的升级

快速排序算法思想:通过一趟排序将待排序记录分隔成为独立的两部分,其中,一部分记录的关键词比另一部分记录的关键词小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

代码的核心是,选取当中的一个关键字,然后想尽办法将它放到一个位置,使他的左边的值都比他小,右边的值都比他大,我们称这样的关键字为枢轴。然后根据这个枢轴的位置划分为两个集合,然后对这两个集合按照上述方法进行处理。
 

 

程序的关键还是进行中间值的选取。

为了减少替换次数,对获取初步有序的集合进行了改进,用替换代替交换操作

 

该算法的时间复杂度为:O(nlogn) 空间复杂度为O(logn)

总结:

几种排序算法的比较

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coder_jt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值