【软考】——排序


    排序主要分为两大类:内部排序和外部排序。文章主要介绍一下内部排序的方法,分为插入排序、交换排序、选择排序和归并排序四种。


    插入排序

    插入排序的方法有直接插入排序、折半插入排序、表插入排序和希尔排序。

    直接插入排序

    直接插入排序是一种简单的排序方法。
    基本思想:依次将每个记录插入到一个已经排好序的有序表中去,从而得到一个新的、记录数增加1的有序表。

    例如:已存在四个记录按键值递增排好序   
{33, 48, 65, 96}
          现在有第五个键值为67的记录要插入到序列中,则可以确定65<67<96,即将67插入到65和96之间,得到最后的结果
{33, 48, 65,67, 96}

    此方法算法简单,易于理解,而且容易实现,记录数量很大时,一般不选用直接插入排序。
    直接插入排序:时间复杂度为O(n^2);
                空间复杂度为O(1);
                排序是稳定的。


    希尔排序

    又称“缩小增量排序”,是对直接插入排序方法的改进。
    基本思想:将整个需要进行排序的序列分割成若干个子系列,再对每个子系列分别进行直接插入排序,当整个序列的记录基本有序时,再对全体记录进行一次直接插入排序。

    例如:对已有记录排序,把全部记录分为m个组依次进行直接插入排序,然后继续取第二个增量,继续排序,所取增量依次减小。如下过程:



    希尔排序: 时间复杂度为O(n^1.3);
               空间复杂度为O(1);
                          排序是不稳定的。


    交换排序

    基本思想:比较两个记录键值大小,如果出现逆序,则交换两个记录。以下介绍冒泡排序和快速排序。

    冒泡排序

    冒泡排序发是一种交换排序方法。
    过程:首先将第一个记录的键值和第二个记录的键值进行比较,如果R[1].key>R[2].key,将两个记录交换,然后继续比较第二个记录和第三个记录的键值。依次类推,直到完成第n-1个记录和第n个记录的键值比较交换为止。
    上述过程为第一趟起泡,要得到最后的结果还要进行多次同样的步骤,直到排序过程终止。

    例如:有以下记录    
56  89  41  23  10  25  82  73   
               进行冒泡排序。
               分析:对初识键值进行第一趟排序,56与89相比较,56<89,不交换;89与41比较,89>41,为逆序,交换位置,56 41 89...;89与23比较,89>23,为逆序,交换位置,56,41,23,89...;......依次类推,最后可将最大值89移至序列尾部,第一趟排序完成。
               经过多趟排序,最终把序列中的键值大者依次往后移,直到得出最后的序列:
10  23  25  41  56  73  82  89

    冒泡排序:时间复杂度为O(n^2);
            是稳定的排序方法。


    快速排序

   快速排序同样是交换排序的一种,是对冒泡排序的一种改进。

    基本思想:在n个记录中取某一个记录的键值为标准,通常取第一个,通过一趟排序将待排的记录分为小于或等于这个键值和大于这个键值的两个独立的部分,继续对每个部分单独进行排序,直到得出最后结果。


    例如:已有序列:

45  85  23  41  58  12  76  34  

          用快速排序对其进行排序。

          分析:首先,以45为基准,45与34进行比较,34<45,将34与45交换位置:34  85  23  41  58  12  76  45;继续将45与85进行比较,85>45,85与45交换位置:34  45  23  41  58  12  76  85;继续将45与76比较,此时45<76,符合顺序,则不交换;继续将45与12比较,45>12,45与12交换位置:34  12  23  41  58  45  76  85;依次类推,直到完成第一趟排序:34  12  23  41  45  58  76  85 

          继续分别对  34  12  23  41  和  58  76  85  进行快速排序,依次类推,直到得出最终结果:

                      12  23  34  41  45  58  76  85


   快速排序:排序方法最佳,时间复杂度O(nlog2n),最坏情况下,时间复杂度O(n^2);

             排序方法是不稳定的



    选择排序

    我们来介绍直接选择排序和堆排序两个选择方法。


   直接选择排序

    基本思想:在第i次选择操作中,通过n-i次键值间比较,从n-i+1个记录中选出键值最小的记录,并和第i(1<=i<=n-1)个记录交换。

 

    例如:已有记录序列

34  45  78  14  26

          用直接选择排序进行排序。

          分析:选择记录34,在45  78  14  26中选出键值最小的记录,即14,与34交换位置:14  45  78  34  26;

                继续选择记录45,在78  34  26中选出键值最小的记录,即26,与45交换位置:14  26  78  34  45;

                继续选择记录78,在34  45中选出键值最小的记录,即34,与45交换位置:14  26  34  78  45;

                继续比较78和45,78>45,将78和45交换位置,得到最后结果:

14  26  34  45  78


    直接选择排序:时间复杂度O(n^2);

                是不稳定的方法。



    归并排序

    归并排序的不同之处在于要求待排序列是由若干个有序子序列组成。归并排序的基础是合并。


    二路归并排序

    将两个有序表合并成一个有序表的排序方法。

    基本思想:序列中有n个记录,可看成是n个子系列,每个系列的长度为1,。首先将每相邻的两个记录合并,得到[n/2]个较大的有序子序列,每个子序列包含2个记录,再依次将上述子序列两两合并,如此反复,知道得到有序序列,排序结束。


    例如:已有序列记录

25  9  78  6  65  15  58  18

          采用归并排序发排序。

          分析:首先将序列中的记录:

两两合并:[25  9]  [78  6]  [65  15]  [58  18]

一次归并后:[9  25]  [6  78]  [15  65]  [18  58]

二次归并后:[6   9   25  78]  [15   18  58   65]

三次归并后:[6  9   15   18   25   58   65   78]


    归并排序:时间复杂度O(nlog2n);

            是稳定的方法。



    总结

    综上所述,快速排序、直接选择排序、堆排序是不稳定的排序,其他的排序方法都是稳定的。

    对于所有的排序算法来说,没有哪一种是最优的,所以,在实际应用时根据不同情况选择合适的算法,或者,有必要时将多种算法结合起来使用。





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值