现在大体框架,子函数可以先用名字代替,最后再写
sort:
- 冒泡,选择,插入 O( n^2)
- 归并,快速,堆 O(nlogn)
- 桶,基数,计数,O(n)
- 冒泡排序
比较相邻的元素,然后交换,大的后移,对所有的元素移动排序,两个for
优化,如果发现某个元素不用移动,可以提前退出内部for循环,说明已经对他来说已经排完了。但注意 23401这种情况看看
- 选择排序
找最小,放在起始位置,然后后面的在找最小,然后跟第二位置交换,以此类推
- 插入排序
两个序列,扫描未排序序列,然后往前比较,然后插入到对应的有序序列的对应位置,知道所有未排序序列都被扫描
- 希尔排序
不稳定排序,优先比较距离远的元素,然后逐渐缩小增量比较,对于插入排序改进,选择增量序列k,按照k的个数进行k躺排序,每趟排序,根据对应增量,分割成子序列然后分别插入排入。
Divide and conquar
- merge sort
把已经排好序的子序列合并。n->n/2和n/2->各自分成两个, 然后分到最小序列,然后一点点合并成最上面,可以用递归算法,但内存消耗比较大,也可以用迭代。分成sort函数和merge函数,在merge时,两个array长度不一定相同,可以用双指针 merge sorted lit,判断一个赋值一个,最后某一个走完之后另一个直接复制到sorted后面
- quick sort
挑出基准量,然后根据这个标准分成左右两边,小在左,大在右,然后不断细分下去,pivot的选择也很重要
- heap sort
类似于二叉树,先创建一个heap,把队首和队尾呼唤,大顶堆和小顶堆,father和child的比较。把heap的尺寸缩小1,然后剩余的元素重新构建大顶堆,然后重复步骤,知道heap的尺寸缩小为1。
- 桶排序 bucket sort
设定一个定量的数组当作空桶,遍历输入数据,并把数据一个一个对应放到桶里,对每个不是空的桶排序,然后从不是空的桶把排好序的数据连接起来。
桶就是一个范围桶,内部进行sort可以merget sort或者其他的也行。
桶的数量的选择, (max-min)/length+1;
- radix sort 基数排序
适合小范围数
首先取得最大值,并取得位数,然后从最低位开始排序,然后根据10号位拍,然后地推,从最小位开始可以保持每个位数内部的大小关系保持:14》13》12这种在10号位=1的内部,这样就能保持一个稳定的。其实内部的实现也是桶排序,bucket
- 计数排序counting sort
找出max和min,然后统计每一个值为i的元素统计次数,然后存入数组C的第i项。 累加所有的次数(从C中第一个元素开始),反向填充目标数组:将每个元素i放在新数组的第c【i】项,每放一个元素就c[i]-1,类似与从桶中一个一个拿出来连着排放位置。
heapsort 可以用来找kth 最大或者最小
kth 最值可以quick sort的pivot思路,递归,
one-pass algorithm:只读一次input
sort_color : 4 color, 初始化4个常量。然后发现0,则所有的count+1,因为底部升高,上面全都升高,后面以此类推就可以求次数
H_index?
wiggle sort: 找中位数,分成前后两个等长部分,然后穿插安放
Maximum gap: bucket控制至少一个空bucket,这样,bucket内部最大gap=一个bucket长度,但是bucket之间gap却可以》=一个bucket之间