排序算法的个人心得体会。
引用文章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) 编辑 收藏 举报