当前位置: 代码迷 >> 综合 >> 数据结构 第二章 向量-2
  详细解决方案

数据结构 第二章 向量-2

热度:60   发布时间:2024-01-26 06:50:43.0

有序向量:
有序性的甄别:

template <typename T> 
int Vector<T>::disordered() const {int n = 0;for (int i = 1; i < _size; i++){if (_elem[i - 1] > _elem[i]) n++;}return n;
}

唯一化:低效版:

template <typename T> int Vector<T>::uniquify(){int oldSize = _size; int i = 0;while (i < _size - 1){(_elem[i] == _elem[i + 1]) ? remove(i+1):(i++);} return oldSize - _size;
} 

高效版:

template <typename T> int Vector<T>::uniquify(){Rank i = 0, j = 0;while( ++j < _size){if (_elem[i] != _elem[j]) _elem[++i] = _elem[j];}_size = ++i; shrink();return j - i;
} 

查找:

//二分查找 A版本 
template <typename T> 
static Rank binSearch( T* A, T const & e, Rank lo, Rank hi) {while(lo < hi){Rank mi = (lo + hi)>>1;if (e < A[mi]) hi = mi;else if (A[mi] < e) lo = mi + 1;else return mi;}return -1;
}

Fibonacci 查找: 

template <typename T> 
static Rank fibSearch( T* A, T const & e, Rank lo, Rank hi)
{Fib fib(hi - lo);while (lo < hi){while(hi - lo < fib.get()) fib.prev();Rank mi = lo + fib.get() - 1;if (e < A[mi]) hi = mi;else if ( A[mi] < e) lo = mi + 1;else return mi;}return -1;
}

二分查找版本B:

template <typename T> 
static Rank binSearch(T* A, T const& e, Rank lo, Rank hi){while (1 < hi - lo){Rank mi = (lo + hi)>>1;(e < A[mi]) ? hi = mi:lo= mi;}return (e == A[lo])?lo:-1;
}

二分查找版本C:

template <typename T> 
static Rank binSearch(T* A, T const& e, Rank lo, Rank hi){while (lo < hi){Rank mi = (lo + hi)>>1;(e < A[mi]) ? hi = mi:lo= mi + 1;}return --lo;
}