算法基础
一:插入排序
插入排序:对于少量的元素排序,它是个有效的算法。时间复杂度:N^2
插入排序好比一手扑克牌。每次从桌上拿走一张牌将它按顺序插入正确的位置。为了找到这张牌的正确位置,我们需要从右到左依次比较(靠左最小)。
伪代码如下:
二:归并排序
分治法:分解、解决、合并
1:分解元问题为若干子问题,这些子问题是元问题的规模较小的实列。
2:解决这些子问题,递归地求解各子问题。
3:合并这些子问题的解就成元问题的解。
归并排序完全遵循分治模式。关键是合并。
假设(A,p,q,r) 其中A是一个数组,p、q和r是数组下标,满足p<=q<r。
假设子数组A[p······q]和 A[q+1,·····r]都已经排好序。
只要合并两个子数组就可以替代A[p····r]。
伪代码如下:
时间复杂度:nlgn
三:堆排序
时间复杂度: nlgn
最大堆:A[parent(i)]>=a[i] 结点的值至多与父结点一样大,堆中最大的元素为根结点。
A.length 为给出数组的元素个数
A.heap-size:有多少个堆元素存储在该数组中
1.堆维护性质(Max-Heapify(A,i))
用于维护最大堆性质。
Max-Heapify(A,i)
伪代码:
2.建堆(Build-Max-Heap(A))
利用Max-Heapify 把咦个大小为n=A.length的数组A[1``n]转化为最大堆。
伪代码:
3.堆排序算法
堆排序利用Build-Max-Heap将输入数组A[1···n]建成最大堆,其中n=A.length,此时数组中最大元素总在根结点A[1]中
这时候我们从堆中去掉结点n,调用Max-Heapify(A,1),从而在A[1,···n-1]构造一个新的最大堆。重复此过程,直到堆的大小从n-1降到2
伪代码如下: