排序算法大集成

通常说的排序算法是内部排序,相对应的还有外部排序。

外部排序是指大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的。(多使用多路归并排序算法)

说明:文字性的说明清晰明了,具体的例子直观明确。以下的排序算法的说明不含文字性的描述,不含代码性的解释,纯粹是举例说明。是在做了牛客网上的300多到排序的题之后,总结出来的,希望能帮助到大家,同时也是对自己知识的总结、

内部排序是指待排序列完全存放在内存中所进行的的排序过程,是和不太大的元素序列。

几种内部排序的时间复杂度和空间 复杂度

类别排序方法时间复杂度(平均)时间复杂度(最好) 时间复杂度(最坏)空间复杂度稳定性
插入排序直接插入O(n^2)O(n)O(n^2)O(1)稳定

希尔排序O(n^1.3)O(n)O(n^2)O(1)不稳定
选择排序直接选择O(n^2)O(n^2)O(n^2)O(1)不稳定

堆排序O(nlog2 n)O(nlog2 n)
O(nlog2 n)
O(1)不稳定
交换排序冒泡O(n^2)O(n^2)
O(n^2)
O(1)稳定

快排O(nlog2 n)O(nlog2 n)
O(n^2)O(nlog2 n)
不稳定
归并排序
O(nlog2 n)
O(nlog2 n)
O(nlog2 n)
O(n)稳定
基数排序
O(d(r+m))O(d(n+rd))O(d(r+n))O(rd+m)稳定


几个简单的规则:

1、元素的移动次数与关键字的初始次序无关的是:基数排序

2、元素的比较次数与初始序列无关:选择排序   堆排序   基数排序

3、拓扑排序:有向无环图

4、已排好序的,插入排序最快

5、插入排序和冒泡排序对大的数据集效率低

快排:原序列越无序,效率越高

原序列:25   84   21   47   15   27   68   35   20

第一趟:20   15   21   25    47  27   68   35   84      以25为基准,从右侧找比25小的放在左侧,比25大的放在右侧

简单说明:25   84   21   47   15   27   68   35   20

                  20   84   21   47   15   27   68   35       

                  20          21   47   15   27   68   35   84

                  20   15   21   47          27   68   35   84

                  20   15   21           47  27   68   35   84

                  20   15   21  25    47  27   68   35   84

第二趟:15  20   21   25  35    27  47  68   84 

第三趟:15  20   21  25   27    35  47  68   84   

说明:绿色字为每趟的基准数字。

插入排序:给一列有序数里面插入一个数,插入后有序

原序列:60    71   49   11   24   3    66

第一次:60    71   49   11   24   3    66     

第二次:60    71   49   11   24   3    66     

第三次:49    60   71   11   24   3    66

第四次:11    49   60   71   24   3    66

第五次:11    24   49   60   71   3    66

第六次: 3     11   24   49   60   71  66

第七次: 3     11   24   49   60  66  71

希尔排序:直接插入排序的一种,缩小增量排序,一般的初次取序列的一半为增量,以后每次减半直到1,一般为奇数,增量为下标之差    每组内存采用直接插入排序

原序列:49   38   65   97   76   13    27   49   55   04

第一次:13  27  49  55   04    49  38  65   97   76      d=5,颜色相同为一组。

第二次:13   04   49   38   27   49    55   65   97   76      d=3

第三次:04   13   27   38   49   49    55   65   76   97      d=1

选择排序:长度为N的无序数中,第一趟遍历N个数找到最小的和第一个数交换,之后第i趟,找到第i个数(包括第i个)之后那组数的最小值和第i个数交换

原序列:59   12    80   91    20

第一次:12   59    80   91    20

第二次:12   20    80   91    59

第三次:12   20    59   91    80

第四次:12   20    59   80    91 

基数排序:适用于位数小的序列    LSD(从个位开始) MSD(从最高位开始)

原序列:73  22  93   43   55  14   28   65   39   81

第一趟:81  22  73   93   43  14   55   65   28   39    个位按照增序排列

第二趟:14  22  28   39   43   55  65   73   81   93     在第一趟的基础之上,按十位进行增序排列

归并排序:分治法

原序列:6   202   100   301   38   8    1

第一次:{6   202},{100  301},{8  38},{1}     比较3次  6和202,100和301,8和38

第二次:{6   100   202   301},{1   8   38}         比较4次  6和100,202和100,202和301,1和8

第三次:{1   6   8   38   100   202   301}            比较4次  1和6,6和8,8和100,100和38

二路归并:分解与归并

原序列:                      2   4  7  5   8  1  3  6

                               2  4  7  5               8  1  3  6

                         2   4          7    5      8    1        3     6

                         2   4          7    5      8    1        3     6

                         2   4          5    7      1     8       3      6

                              2   4   5  7              1  3   6   8

                                    1  2  3  4  5  6  7  8

桶排序:

原序列:6  2  4   1   5  9

桶:         0   0   0   0   0   0   0   0    0    0

桶编号:  0   1   2   3   4   5   6   7   8    9

数放桶:  0   1   2   0   4   5   6   0   0    9

计数排序:空间复杂度O(n) 时间复杂度O(n)

原序列:        2   5   3   0   2   3   0   3 

辅助数组C:  0   0   0   0   0   0         下标从0开始

C赋值:         2    0   2   3   0   1        等于该数组下标的元素的个数

C处理:         2    2   4   7   7   8        小于等于下标的元素个数之和

堆排序:小顶堆,大顶堆

原序列:45   28   49    16    37   82     56     以小顶堆为例 

                               45                                                   16

                         28         49                                      28         49

                    16    37    82   56                             45   37    82   56

                    75                                                    75

                                                                                   初始堆

输出:16   28   37  45   49  56  75  82

                      75                                                         28

               28           49                                         37          49

            45   37    82   56                                 45    75   82    56

            16

            (1)16和75交换,输出16                  (2)去掉16之后,进行调整

                       56                                                        37

              37            49                                        45             49

         45    75      82    28                                56   75          82

             (3)28和56交换,输出28                  (4)去掉28之后,进行调整

                      82                                                           45

              45             49                                          56           49

         56     75         37                                     82    75   

             (4)37和82交换,输出37               (5)去掉37之后,进行调整

                     75                                                          49

              56            49                                         56          75

           82   45                                                     82

             (6)45和75交换,输出45               (7)去掉45之后,进行调整

                     82                                                        56

             56           75                                             82  75 

             49

     (8)49和82交换,输出49                     (9)去掉49之后,进行调整

                     75                                                        75

                82       56                                                  82

      (10)56和75交换,输出56                  (11)去掉56之后,进行调整

                     82                                                        82

                     75

      (12)75和82交换,输出75                  (13)去掉75之后,调整,只剩82,输出82

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值