• 排序算法的个人心得体会。


    引用文章A:http://blog.csdn.net/whuslei/article/details/6442755

    引用介绍:介绍了排序的复杂度(time and space) 以及稳定性。

    算法会在2015/3/1更新至GITHUB。Addr:https://github.com/zheng39562/arithmetic

    2015/3/1版:暂定为int排序。目标为泛型算法。

    本文仅介绍个人在其中遇见的问题。如果对算法并不了解/遗忘。可以阅读引用文章。也欢迎对更多的见解:)

    基本概念:

      1)时间复杂度:通常分为最好和最坏情况。但通常而言基本会考虑最坏情况。因为最好情况基本都会有一定的先决条件,作为通用算法。必须按照最坏情况计算。

        1,但在针对性领域,在确定前提情况下,可以使用最好情况来编写代码(但必须有绝对把握)

      2)空间复杂度:需要的辅助空间量。

        1,牺牲时间,还是牺牲空间。并没有绝对的答案。完全看自己的情况而定。

      3)稳定性:通俗的理解即,两个在比较条件中相等的元素,在多次排序中不改变顺序。(具体见引用A)

        1)对于稳定性,个人理解,就是把所有元素都当作不同元素时(包括相等元素),排序结果依然只有一种。

        2)引用A中的一个猜测:若存在两个不相邻元素的交换,则可能是不稳定的。

    1:冒泡算法。时间复杂度最坏/最好/平均:O(n2),O(n),未知。稳定性;稳定。

      1,冒泡排序大概是最容易懂的排序了吧。

    2:插入算法:时间复杂度最坏/最好/平均:O(n2),O(n),O(n2)。稳定性;稳定。

      1,插入排序需要移动数组元素。所以,建议:从后往前进行比较。这并不一定会提高移动速度,但可以不需要单独做一个移动函数(从前往后,可能需要一次性移动多个元素,从后往前,则可以在判断时直接进行邻近交换)。

      2,插入排序中如果不应用其他优化。是一个比较坑爹的排序。(总是不自觉的想在其中加入其他排序算法)

    3:希尔排序:时间复杂度最坏/最好/平均:O(nlogn),未知,O(nlogn)。稳定性;不稳定。 

      1,无法理解为何其时间复杂度为O(nlogn)。

      2,类似与二分法来解决插入排序。

    4:快速排序:时间复杂度最坏/最好/平均:O(nlogn),未知,O(nlogn)。稳定性;不稳定。 

      1,while( array[i--] ... ) // 需要注意,无论循环是否执行,i都退出循环时,都会比期望的少1。如果使用此方式循环并且在后续还要继续使用 i 这个值,则需要慎重思考。

    5:选择排序:时间复杂度最坏/最好/平均:O(n2),O(n2),O(n2)。稳定性;不稳定。 

      1,表示实现不想写这个代码。希望我这辈子都不会用到。。。

    6:堆排序:时间复杂度最坏/最好/平均:O(nlogn),未知,O(nlogn)。稳定性;不稳定。 

      1,写成了heap类。当使用链表构建时,需要注意末尾指针的移动。

    7:并归排序:时间复杂度最坏/最好/平均:O(nlogn),o(nlogn),O(nlogn)。稳定性;稳定。空间复杂度:O(n)

      1,这是少数几种需要占用辅助内存的常规排序方法。但,它是时间复杂度nlogn中的唯一稳定的排序方式。当对于元素位置有强烈要求时,推荐此排序方式。

    8:基数排序:按位比较排序。先按照个位,再按照十位,依次类推。

      1,要求:最高位数。并且只有针对数字,或可以有类推规律的数据。

      2,其时间复杂度仅为o(n)。如果对时间要求略高,但同时符合要求,可以考虑此方式。

  • 相关阅读:
    字符串匹配之BF算法
    python里的反射(自学习)
    python的super()以及父类继承
    @staticmethod
    @classmethod
    scrapy
    mongodb
    js注入提取伪元素选择器
    execjs
    base64解密
  • 原文地址:https://www.cnblogs.com/zheng39562/p/4306221.html
Copyright © 2020-2023  润新知