引言
自己理解,闭卷纯手打。
插入排序
直接插入排序
稳定性:稳定
时间复杂度:O(n) 最好情况:O(n) 最坏情况:O(n2)
将一个记录插入到一个已排好序的数列中,重复执行,直至结束。
希尔排序
稳定性:不稳定
时间复杂度:O(n1.3) 最好情况:O(n) 最坏情况:O(n2)
按一定的间隔进行排序,重复运行,直至结束,每次运行的间隔逐渐缩小,直至为1。常见间隔队列取
{n/2,n/4,n/8,...1},也可取奇偶数,取法随意。
选择排序
简单选择排序
稳定性:不稳定
时间复杂度:O(n2) 最好情况:O(n2) 最坏情况:O(n2)
每次选择最小的数,存放到结果集里,第二遍从剩下的数里在选择最小的存放到结果集里,依次重复。
优化:可以每次同时选择最小的和最大的数,存放到结果集里,依次重复。
堆排序
稳定性:不稳定
时间复杂度:O(nlog2n) 最好情况:O(nlog2n) 最坏情况:O(nlog2n)
堆排序运用到二叉树的知识。所建的树必须同时满足ai<a2i和ai<a(2i+1),或者是均大于,及根节点必须
全部小于或大于其两个子节点。
堆顶即为最小值或最大值,取堆顶数,剩下的数重新进行建堆,然后接着取堆顶数,重复执行。
两大关键点:
如何建堆;取堆顶数后如何重新建堆。
交换排序
冒泡排序
稳定性:稳定
时间复杂度:O(n2) 最好情况:O(n) 最坏情况:O(n2)
相邻的两个数相互比较,前者比后者大,后者放前面否则位置不变,第一遍的结果则得到,较小的
放在最前面(以增序为例)
第二轮,同理,继续比较相邻的两个数,结果则是第二小的数放第二位,重复执行。
快速排序
稳定性:不稳定
时间复杂度:O(nlog2n) 最好情况:O(nlog2n) 最坏情况:O(n2)
从无序的数列选择一个数,一般为第一个,将其它数与它比较,比它小的放前面,大的放后面,这样
就分成了两个小的无序数列,而选择的数则是在它排好序后所应当在的位置。
将第一次分割的每个无序小数列按照相同的方法分割,取每个小数列的第一个,再将其分为两个...
重复执行。
归并排序
稳定性:稳定
时间复杂度:O(nlog2n) 最好情况:O(nlog2n) 最坏情况:O(nlog2n)
将一个无序数列分为多个小的数列,比如只有2个元素的有序数列,共有n/2个,将这些小的有序数列
两两合并,成为新的数列,并将新的数列进行排序,共有n/4个有序数列。
再次合并,重复进行操作。
基数排序
稳定性:稳定
时间复杂度:O(d(n+radix)) (待排序列为n个记录,d个关键码,关键码的取值范围为radix)
一个有序的数列比如{12,15,25,26,31},发现在相同的位下,如个位,12<15即比较个位2<5...
大小清晰可辨,十位,百位...同理。现在将个位数相同的数放在一起,再从个位数为0的数列开始,依
次将这些数列串到一起,直到个位数为9。再将十位相同的数放在一起,同理,再从十位数为0的数列开
始,依次将这些数列串到一起,直到个位数为9。重复执行。按照位数高低优先度的标准分为最低位优先
(Least Significant Digit first)法和最高位优先(Most Significant Digit first)法上面是由个位向高位,即为
最低位优先(Least Significant Digit first)法。