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

引用文章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)。如果对时间要求略高,但同时符合要求,可以考虑此方式。

posted on 2015-03-01 20:02  zheng39562  阅读(2486)  评论(0编辑  收藏  举报

导航