选择排序:仅使用常数个存储单元(temp),O(1)
冒泡排序:仅使用常数个存储单元(temp),O(1)
直接插入:仅使用常数个存储单元(temp),O(1)
希尔排序:仅使用常数个存储单元(temp),O(1)
堆排序:删除最大元素之后,直接放在数组的末尾,一边删除一边形成了有序数组,仅需要常数个存储空间
快速排序: 由于快速排序是递归的,需要借助一个递归工作栈来保存递归所需要的信息,其容量与递归调用的最大深度相同,最好情况下为log(N+1)向上取整, 最坏情况下为O(N)
归并排序:递归+归并两个数组都需要空间,递归所需要的空间为O(logN),归并所需要的空间为O(N),所以取最大值,为O(N)
基数排序:需要的空间(基数值+N个元素)
快速排序,当初始序列基本有序的时候,最不利于发挥其优势,越能够等分待排序数组,越高效
在十分接近有序的序列中,各种算法的时间复杂度,不一定等于最优时间复杂度:
插入排序: O(N)
归并排序,与是否有序无关,O(N*logN)
快速排序,越有序,越低效,由于采用了首元素作为pivot,所以每次都只有一面,这样的话,时间复杂度就为最差时间复杂度O(N^2)
对于ABD,数组首尾应该是有序,而且是有序极值
排序算法的时间复杂度,与需要比较的次数相关,与存储结构,是否稳定排序是无关的
选择排序,冒泡排序,堆排序,极值必定出现在尾部
快速排序,必有pivot
希尔排序,必定间隔有序
归并排序,必定成组有序
折半插入,直接插入,一端有序
判断是不是快速排序:找pivot
希尔排序,直接插入排序,在一趟排序结束之后,都不一定能选出一个元素在其最终位置上
严蔚敏:将pivot赋值给temp,然后先移动high指针,找到不合理元素后,将A[low]替换,然后移动low指针,找到不合理的元素后,替换掉high指针所指向的元素,交替移动high,low指针,找到不合理的,就像踢皮球一样将对方指针给覆盖,low指针从最开始的low开始,当满足A[low/high] >= / <= pivot的时候,就进行互换,而不是只有满足 > 或者<的时候才进行互换
外层while循环的条件为:low < high,而不是low <= high,即当low指针与high指针重合的时候就退出循环,然后用pivot替换A[low/high]
插入:直接插入,折半插入,希尔排序
交换:冒泡排序,快速排序
选择:简单选择,堆排序
基数排序和归并排序
这三种方法进行比较,堆排序是最快的(logN)
同上
本题易错:
如果遇到7,8,9,1这样的冒泡序列,那么每次冒泡还是会讲一个元素放到正确的位置上