数据结构 第8章总结

排序

  基本概念

    排序定义:重新排列表中的元素,使表中的元素满钻关键字递增或递减

    时空复杂度:决定内部排序算法的性能

    稳定性:若待排序表中有两个元素Ri和Rj,其对应关键字Ki=Kj,且在排序前Ri在Rj前面,若使用某排序算法后,Ri仍在Rj前面,则排序算法稳定,否则不稳定(是算法的性质,不能衡量一个算法的优劣

  内部排序:指在排序期间元素全部存放在内存中的排序

    插入排序

     每次将一个待排序的序列插入到一个前面已排好序的子序列当中

      直接插入排序

        适用于顺序存储和链式存储

        算法过程:查找插入位置-将该位置后的元素全部后移一个位置-将需插入的元素复制到该位置

        时间复杂度 最好O(n) 平均O(n^2) 最坏O(n^2)

        空间复杂度 O(1)

        稳定性:稳定

 

      折半插入排序

        适用于顺序存储

        算法过程:利用折半查找的思想:折半查找(找到第一个大于/小于当前元素值的位置)+移动(该位置之后的所以元素向后移动一位)

        时间复杂度 O(n^2)

        空间复杂度 O(1)

        稳定性:稳定

 

      希尔排序

        适用于顺序存储

        算法思想:缩小增量排序:将排序表(按增量d=n/2取下界)分割为多个子表-对每个子表进行直接插入排序至表中元素呈“基本有序”-对全体记录进行一次直接插入排序

        时间复杂度 最坏O(n^2) 某一情况下O(n^1.3)

        空间复杂度 O(1)

        稳定性:不稳定

    交换排序

      冒泡排序

        适用于顺序存储和链式存储

        算法思想:从后往前(从前往后)两两比较相邻元素的值,若为逆序,则交换这两个元素,直至序列比较结束(一次冒泡会将一个元素放置到它最终的位置上,表长为n下标从1开始的表,第i趟确定a[n-i+1])

        时间复杂度 最好O(n) 平均O(n^2) 最坏O(n^2)

        空间复杂度 O(1)

        稳定性:稳定

 

      快速排序

        适用于顺序存储(链式存储)

        算法思想:在待排序表中任取一个元素pivotkey为基准-排序:pivot放置的位置前所有元素小于pivotkey,位置后所有元素大于pivotkey…(一次划分会将一个元素pivot放置到它最终的位置上)

          初始化标记low为划分部分的第一个元素的位置,high为最后一个元素的位置,不断移动两标记并交换元素:

          1)high向前移动找到第一个比pivotkey小的元素,

          2)low向后移动找到第一个比pivotkey大的元素,

          3)交换当前两位置的元素,

          4)继续移动标记,执行1)2)3)直到low>=high为止

        预处理:三者取中

        时间复杂度 最好/平均O(nlog2 n) 最坏O(n^2)(基本有序或逆序的情况)

        空间复杂度 最好/平均O(nlog2 n) 最坏O(n)(基本有序或逆序的情况)

        稳定性:不稳定

    选择排序

      简单选择排序

        适用于顺序存储和链式存储

        算法思想:每一趟在待排序序列的n-i+1个待排序元素中中选取最小的元素,作为有序子序列的第i个元素,直到n-1趟做完待排序元素只剩一个(一次排序会将一个元素放置到它最终的位置上)

        时间复杂度 O(n^2)(时间复杂度与初始序列无关

        空间复杂度 O(1)

        稳定性:不稳定

 

      堆排序

        适用于顺序存储(链式存储)

        小根堆:若L[i]<=L[2i]且L[i]<=L[2i+1],则成为小根堆(1<=i<=[n/2]取下界)

        大根堆:若L[i]>=L[2i]且L[i]>=L[2i+1],则成为大根堆(1<=i<=[n/2]取下界)

        在排序过程中将L视为一棵完全二叉树的顺序存储结构(双亲i,左孩子2i,右孩子2i+1)

        初始化(大根堆):对所有具有双亲结点含义编号从大到小([n/2]取下界~1)做出如下调整:

          1)若孩子结点皆小于双亲结点,则该结点的调整结束

          2)若存在孩子结点大于双亲结点,则将最大的孩子结点与双亲结点进行交换,并对该孩子结点进行1)2),直到出现1)或到叶子结点为止

          时间复杂度 O(n)

        排序:不断输出堆顶元素并向下调整

          时间复杂度 O(nlog2 n)

          空间复杂度 O(1)

          稳定性:不稳定

        插入:将新结点放置在末端然后进行向上调整

    归并排序

      将表内元素归并为多个组,反复进行有序表的合并,直至成为有序表

      时间复杂度 O(log2 n)

      空间复杂度 O(n)

      稳定性:稳定

    基数排序

  外部排序:指在排序期间元素无法全部同时存放在内存中,必须在排序过程中根据要求不断地在内、外存之间进行移动

    多路归并排序

————————————————————

总结:本章是数据结构这门课的最后一章,与上一章相似的是,排序对之前的知识运用的很多,而且在这一部分提出了很多新的算法,会在下一学期的算法课中继续学习,在数据结构课中只要求能够理解算法的逻辑并且能手动完成整个流程。学习排序这一章时已经到了学期的尾声,开始对以前的知识进行复习,就像老师说的,需要认真的看回课本,梳理好这门课的脉络。除了对单纯知识的掌握,更要掌握的是在遇到实际问题的时候如何运用它们,在条件变化时是否会对整个算法的运行产生影响(例如二分查找中high与mid的关系),都是需要我们深挖的。最后,很感谢晓梅老师在大一期间对我们的教导,我敢保证的是大一上的C++和大一下的数据结构是我学的最认真的两门课。晓梅老师从第一节课就告诉我们作为学计算机的学生,一定要深挖到知识的底层,也就是因为这样,我才对这个学科越来越感兴趣,在她的教学中我能感受到她对编程的强烈热爱,这也深深感染了班上的同学们。在老师的引导下,我的学习也渐渐从老师教什么我就学什么,到后来变成我想知道什么我就去学什么,永远对学习的事物保持新鲜感和探索精神,我想这也是作为一个计算机系学生应该要做的。爱晓梅老师~

posted @ 2020-07-12 01:14  1905陈美  阅读(165)  评论(0编辑  收藏  举报