1.有序向量----Fibonacci查找:对二分查找的改进
与二分查找相比,Fibonacci查找算法的明显优点在于它只涉及加法和减法运算,而不用除法。因为除法比加减法要占去更多的机时,因此,Fibonacci查找的平均性能要比折半查找好。
例子:
template<typename T>
static Rank fibSearch(T *A,T const &e,Rank lo,Rank hi)
{
Fib fib(hi-lo);
while(lo<hi)
{
while(lo-hi<fib.get())
fib.prev():
Rank mi=lo+fib.get-1;
if(e<A[mi])
hi=mi;
else if(a[mi]<e)
lo=mi+i;
else
return mi;
}
return -1;
}
查找长度只有向左向右失败后才会终止查找。
2.有序向量----插值查找:就是二分查找的改进
插值查找其实说白了就是上面二分查找的优化,因为从中间对查找表进行拆分并不是最优的解决方案。因为我们的查找表是有序的,当我们感觉一个值比较大时,会直接从后边来查找。
插值查找就是让mid更趋近于我们要查找的值,将查找表缩小到更小的范围中,这样查找的效率肯定会提升的。
3.起泡排序
起泡排序的过程就是在两个数逆序的时候交换
在某趟排序的比较中,若发现两两比较没有交换记录,说明这时候已经有序,没必要比较到最后}
4.归并排序
归并排序是多次将两个或两个以上的有序表合并成一个新的有序表
归并排序有两种实现方法:自底向上和自顶向下。
1.稳定性
归并排序是一种稳定的排序。
2、存储结构要求
可用顺序存储结构。也易于在链表上实现。
3、时间复杂度
对长度为n的文件,需进行 一趟二路归并,每趟归并的时间为O(n),故其时间复杂度无论是在最好情况下还是在最坏情况下均是O(nlgn)。
4、空间复杂度
需要一个辅助向量来暂存两有序子文件归并的结果,故其辅助空间复杂度为O(n),显然它不是就地排序。
注意:
若用单链表做存储结构,很容易给出就地的归并排序