基于比较的排序算法

  • 选择排序

        基本思想:依次从数字序列中选取最大的数,其次大的数,并将其与最后,倒数第二位的数字进行交换,直至剩下一个数。

        步骤:

                 1.共有两层循环

                 2.外层循环是依次对n,n-1,……,1个元素进行排序,记任意一次循环针对的元素数为i。

                 3.内层循环对i个元素进行,找到最大的元素所在的位置p,然后与最后一个元素进行交换。

         伪代码:

       算法复杂度:

\begin{center} T(n)=\sum_{i=n}^{2}(i-1)=1/2n(n-1) \end{center}

  • 冒泡排序

       基本思想:

         对数字序列从前往后遍历,每次遇到前面的数字比其后面的数字大时,就将他们交换。这样第一遍后一定会使最大的数字排在最后面。此后重复此过程,这样每一遍都在将一个最大的数字排在后面的同时,也使整个序列更加有序。若某一遍未发现有可交换的数字则终止,否则直至剩下一个数字。

       伪代码:

       算法复杂度

T_{best}=n-1

T_{worst} = \sum_{i=n}^{2}(i-1) = 1/2n(n-1)

  • 插入排序

       基本思想:

          对于给定的数字序列从前往后操作。先考虑前两个数字,如果第二个数字小于第一个数字,则将其与第一个数字进行交换,这样这两个数字就是有序的了。接下来暂存第三个数字,并将其与第二个数字进行比较,如果第二个数字小于第三个数字,则第三个数字就是前三个数字里最大的数字,只要将其放回原位置就好,如果第二个数字大于第三个数字,则将其移到3号位置上。再看第一个数字,如果它比第三个数字小,则将第三个数字放在2号位上,这是三个数字就排好了。如果第一个数字大于第三个数字,则将其放在2号位置上,再将第三个数字放在1号位置上,则该种情况下的3个数字就排好了。

这种方法每次考虑一个新加进来的数字时,充分地利用此前已经排序的结果,从而达到提高排序效率的目的。

       伪代码:

     算法复杂度:

T_{best}=\sum_{i=2}^{n}1=n-1

T_{worst} = 1/2n(n-1) 

  • 堆排序

       基本思路:

        1、将给定的数组转化成二叉堆,然后将此二叉堆转化成为最大堆(从第一个非叶节点开始,该非叶节点同其左孩子和有孩子之间较大的那个进行交换)。

        2、交换堆中的第一个元素和最后一个元素,则新的最后一个元素即是已经排好序的元素。

        3、将堆的大小减1,并对第一个元素执行SiftDown操作。

        4、继续这一过程,当堆的大小减到1时,即完成了对数组的排序。

        伪代码:

        算法复杂度:

T(n)=O(nlogn)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值