引用文章A:http://blog.csdn.net/whuslei/article/details/6442755git
引用介绍:介绍了排序的复杂度(time and space) 以及稳定性。github
算法会在2015/3/1更新至GITHUB。Addr:https://github.com/zheng39562/arithmetic算法
2015/3/1版:暂定为int排序。目标为泛型算法。数组
本文仅介绍我的在其中碰见的问题。若是对算法并不了解/遗忘。能够阅读引用文章。也欢迎对更多的看法:)函数
基本概念:优化
1)时间复杂度:一般分为最好和最坏状况。但一般而言基本会考虑最坏状况。由于最好状况基本都会有必定的先决条件,做为通用算法。必须按照最坏状况计算。spa
1,但在针对性领域,在肯定前提状况下,可使用最好状况来编写代码(但必须有绝对把握).net
2)空间复杂度:须要的辅助空间量。指针
1,牺牲时间,仍是牺牲空间。并无绝对的答案。彻底看本身的状况而定。blog
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)。若是对时间要求略高,但同时符合要求,能够考虑此方式。