排序算法总结

来源:互联网 发布:淘宝9月份有什么活动 编辑:程序博客网 时间:2024/06/06 18:28

【排序算法】    


       计算机储存了数以千兆的不同数据,如果不对这些数据进行一些有规则的排放,那么在计算机调取数据的时候会很费劲。排序是对数据处理过程中很重要的运算。对数据进行良好的排序工作,那么在处理数据时无疑也会提高效率。

      排序就是将一组数据按照规定的次序重新排列的一个过程。

      排序算法的稳定性。稳定性是排序本身的特性,如果算法是稳定的,那么对所有的数据序列都是稳定的,反之不稳定。例如:在待排序的记录序列中,存在多个具有相同关键字的信息,经过排序,如果这些具有相同关键字的记录的相对位置不变,则它就是稳定的,如果变了,就是不稳定的。

      例1: A--【3,4,5,7,3,5,9】。

      记录A中有两个键值相同的记录值【5,5】,并且【5】在【5】之前。如果经过排序后,这两个键值的相对位置没有变,那么次排序算法就是稳定,反之不稳定。

     评价一个排序算法的优劣,还有两个标准空间复杂度、时间复杂度。空间复杂度是一个算法在运行过程中临时占用存储空间大小的量度。时间复杂度是以在排序过程中发生的比较次数和移动次数为衡量度。


【排序分类】


     排序分两大类:内部排序和外部排序。区分的标准很简单。既待排序的记录是否全部存放在计算机的内存中。排序分类如图所示:

                         

【排序介绍】

    插入排序:

         直接插入排序:依次将每一个记录插入到一个已排好序的有序表中,从而得到一个新的、记录数增加1的有序表。

    交换排序:

         冒泡排序:比较两个记录键值的大小(A,B),如果出现逆序(A>B)则交换这两个键值(B,A),得到小的值向序列前移动,大的向后移动。N个数,进行N-1次比较后确定第N位数值的大小。然后再在N-1个序列中再次进行之前的排序,确定N-1位数值的大小。

         例:【23,4,58,15,64】

         第一步:比较【23,4】得到序列【4,23,58,15,64】;

         第二步:比较【23,58】得到序列【4,23,58,15,64】;

         第三步:比较【58,15】得到序列【4,23,15,58,64】;

         第四步:比较【58,64】得到序列【4,23,15,58,64】;

         最终得到N=5位的数值为64。接下来重新进行N-1 位序列的比较。即423155864】。因为每次两两比较交换很像一次冒泡,所以这种排序方法叫做冒泡排序。

        冒泡排序的时间复杂度为O(N2),N的平方。且它无数据不唯一的情况,所以它是属于稳定算法。

       

       快速排序:它实际上是对冒泡排序的一种改进。它在N 个记录中取出一个记录键值为标准(通常为第一个),通过依次比较大小,将N个数分为小于、等于或者大于这个键值的两个独立部分。然后对这个两个部分的序列进行同样的操作,分裂成四部分。然后再次分裂操作。直到达到排序目标。

        例:【5,9,2,56,10,6,7】

        第一步:依次和第一个记录键值【5】比较得到两部分【2,5,5】【9,6,10,6,7】;

        第二步:对分裂成的两部分的第一个键值各自比较得到四部分:【2】,【5,5】,【6,6,7,9】,【10】

        第三步:继续对第一个键值比较得到【2】【】【5,5】【】【6,6】【7,9】【10】【】

        最终得到序列【2,5,5,6,6,7,9,10】

 

        快速排序属于具有不稳定性质的排序,例中【5,5】【6,6】在排序过程中的相对位置发生了变化。

 

    选择排序:

        直接选择排序:在第I 次选择操作中,通过N-I 次键值间比较,从N-I +1 个记录中选出键值最小的记录,并和第I 个记录交换。

        简单点来说就是从N的数之间比较得出最小值,从而确定第一为的数值;从N-1 个数中比较选出最小值,从而确定第二位的数值。

        例:【23,5,48,5,4,2】

        第一步:一次比较序列得出当中最小值为【2】,则交换【2】与【23】的位置得:【2,5,48,5,4,23】;

        第二步:依次比较【5,48,5,4,23】得出最小值为【4】,则交换得【4,48,5,5,23】;

        第三步:依次比较【48,5,5,23】得出最小值位【5】,得出序列【5,48,5,23】;

        重复步骤依次得到序列:【5,48,23】【23,48】【48】的最小值分别为【5】【23】【48】。最终的到排序完的序列为:

        【2,4,5,5,23,48】


        可以看出【5】【5】的顺序在排序前后不一样,说明直接选择排序并不稳定。

 

        堆排序:对于堆排序有一个很好博客讲解链接提供给大家,里面介绍的很详细。地址如下:

            冯尧--简单理解四种排序算法

                                                 

     归并排序:归并排序的核心操作是两个有序子序列的合并。

         二路归并排序:将两个有序表合成一个有序表。基本思路是:有N个记录组成的序列。通过前后两两相合,经过比较组成N/2 个有序序列。然后再通过前后两两序列相合,经过比较组成N/2/2 个有序序列。直到形成唯一的序列。

         例:序列【15,6,8,42,64,83,11,45】

        第一步:前后两两相合,并通过比较形成有序序列【6,15】【8,42】【64,83】【11,45】

        第二步:前后两两相合,并通过比较形成有序序列【6,8,15,42】【11,45,64,83】;

        第三步:同上:【6,8,11,15,42,45,64,83】


【各排序算法的复杂度】


      



0 0
原创粉丝点击