Vector

typedef int Rank;
#define DEFAULT_CAPACITY 3

template<typename T> class Vector{
protected:
    Rank _size; int _capacity; T* _elem;
    void copyFrom(T const* A, Rank lo, Rank hi);
    void expand();
    void shrink();
    bool bubble(Rank lo, Rank hi);
    void bubbleSort(Rank lo, Rank hi);
    Rank max(Rank lo, Rank hi);
    //void selectionSort(Rank lo, Rank hi);
    void merge(Rank lo, Rank mi, Rank hi);
    void mergeSort(Rank lo, Rank hi);
    //Rank partition(Rank lo, Rank hi);
    //void quickSort(Rank lo, Rank hi);
    //void heapSort(Rank lo, Rank hi);

public:
// construct function
    Vector( int c = DEFAULT_CAPACITY, int s = 0, T v = 0)
    { _elem = new T[_capacity = c];
      for( _size = 0; _size < s; _elem[_size++] = v);
    }
    
    Vector(T const* A, Rank n) { copyFrom(A, 0, n); }
    
    Vector(T const* A, Rank lo, Rank hi) { copy(A, lo, hi); }
    
    Vector(Vector<T> const& V) { copyFrom(V._elem, 0, V._size); }
    
    Vector(Vector<T> const& V, Rank lo, Rank hi) { copyFrom(V._elem, lo, hi); }
    
// desctruct function
    ~Vector() { delete [] _elem; }

// method only read
    Rank size() const { return _size; }
    bool empty() const { return !_size; }
    int disordered() const;
    Rank find(T const& e) const { return find(e, 0, _size); }
    Rank find(T const& e, Rank lo, Rank hi) const;
    Rank search(T const& e) const { return (0>= _size) ? -1 : search(e, 0, _size); }
    Rank search(T const& e, Rank lo, Rank hi) const;
    
//method read and write
    T& operator[] (Rank r) const;
    Vector<T> & operator= (Vector<T> const&);
    
    T remove (Rank r);
    int remove (Rank lo, Rank hi);
    
    Rank insert(Rank r, T const& e);
    Rank insert(T const& e) { return insert(_size, e); }
    
    void sort(Rank lo, Rank hi);
    void sort() { sort(0, _size); }    
    
    void unsort(Rank lo, Rank hi);
    void unsort() { unsort(0, _size); }
    
    int deduplicate(); //unsorted
    int uniquify();  //sorted
    
//traverse
    void traverse(void (*visit) (T&));
    template <typename VST> void traverse (VST&);
}; // vector

template<typename T>
void Vector<T>::copyFrom(T const* A, Rank lo, Rank hi){
    _elem = new T[_capacity = 2 * (hi - lo)];
    _szie = 0;
    while(lo < hi){
        _elem[_size++] = A[lo++];
    }
}

template<typename T>
void Vector<T>::expand(){
    if(_size < _capacity) return;
    if(_capacity < DEFAULT_CAPACITY) _capacity = DEFAULT_CAPACITY;
    T* oldElem = _elem;
    _elem = new T[_capacity <<= 1];
    for(int i = 0; i < _size; i++){
        _elem[i] = oldElem[i];
    }
    delete [] oldElem;
}

template<typename T>
void Vector<T>::shrink(){
    if(_size < DEFAULT_CAPACITY << 1) return ;
    if(_size << 2 > _capacity) return ;
    T* oldElem = _elem;
    _elem = new T[_capacity >>= 1];
    for(int i = 0; i < _size; i++){
        _elem[i] = oldElem[i];
    }
    delete [] oldElem;
}

template<typename T>
Rank Vector<T>::find(T const& e, Rank lo, Rank hi) const {
//    assert(_size >= hi && hi >= lo && lo >= 0);
    while( (lo < hi--) && (_elem[hi] != e) );
    return hi;  // hi<lo : false
}

template<typename T>
Rank Vector<T>::search(T const& e, Rank lo, Rank hi) const{
    assert(_size >= hi && hi >= lo && lo >= 0);
    //return (rand() % 2) ? binSearch(_elem, e, lo, hi) : fibSearch(_elem, e, lo, hi);
    return binSearch(_elem, e, lo, hi);
}
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;
}

template<typename T>
Rank Vector<T>::insert(Rank r, T const& e){
    expand();
    for(int i = _size; i > r; i--){
        _elem[i] = _elem[i-1];
    }
    _elem[r] = e;
    _size++;
    return r;
}

template<typename T>
int Vector<T>::remove(Rank lo, Rank hi){ // remove [lo,hi)
    if(lo == hi) return 0;
    while(hi < _size){
        _elem[lo++] = _elem[hi++];
    }
    _size = lo;
    shrink();
    return hi-lo;
}

template<typename T>
T Vector<T>::remove(Rank r){
    T e = _elem[r];
    remove(r, r+1);
    return e;
}

template<typename T>
int Vector<T>::deduplicate(){
    int oldSize = _size;
    Rank i = 1;
    while( i < _size){
        find(_elem[i], 0, i) < 0 ? i++ : remove(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;
}
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>
void Vector<T>::traverse(void (*visit) (T&)){
    for(int i = 0; i < _size; i++){
        visit(_elem[i]);
    }
}

template<typename T> template<typename VST>
void Vector<T>::traverse(VST& visit){
    for(int i = 0; i < _size; i++){
        visit(_elem[i]);
    }
}

template<typename T>
void Vector<T>::sort(Rank lo, Rank hi){

    switch(rand() % 2){
        case 0: bubbleSort(lo, hi);
                cout << "choose bubbleSort"<<endl;
                break;
        case 1: mergeSort(lo, hi);
                cout << "choose mergeSort"<<endl;
                break;
        default: break;
        //case 2: selectionSort(lo, hi); break;
        //case 3: mergeSort(lo, hi); break;
        //case 4: heapSort(lo, hi); break;
        //default: quickSort(lo, hi); break;
    }
}

template<typename T>
void Vector<T>::unsort(Rank lo, Rank hi){
    T* V = _elem + lo;
    for(Rank i = hi - lo; i > 0; i--){
        swap(V[i-1], V[rand() % i]);
    }
}
template<typename T>
void Vector<T>::bubbleSort(Rank lo, Rank hi){
    //assert(lo >= 0 && hi >= lo && _size >= hi);
    while (!bubble(lo, hi--));
}

template<typename T>
inline Rank Vector<T>::max(Rank lo, Rank hi)
{
    return Rank();
}

template<typename T>
bool Vector<T>::bubble(Rank lo, Rank hi){
    bool sorted = true;
    while( ++lo < hi){
        if(_elem[lo - 1] > _elem[lo]){
            sorted = false;
            swap(_elem[lo - 1], _elem[lo]);
        }
    }
    return sorted;
}

template<typename T>
void Vector<T>::mergeSort(Rank lo, Rank hi){
    if(hi - lo < 2) return;
    int mi = (lo + hi) / 2;
    mergeSort(lo, mi);
    mergeSort(mi, hi);
    merge(lo, mi, hi);
}

template<typename T>
void Vector<T>::merge(Rank lo, Rank mi, Rank hi){
    T* A = _elem + lo; // want : A[0,hi-lo) = _elem[lo,hi)
    
    int lb = mi - lo;
    T* B = new T[lb];
    for(Rank i = 0; i < lb; B[i] = A[i++]); //B[0,lb) = _elem[lo,mi)
    
    int lc = hi - mi;
    T* C = _elem + mi;  // C[0,hi-mi) = _elem[mi,hi)
    
    for(Rank i = 0, j = 0, k = 0;(j < lb) || (k < lc); ){
        if((j < lb) && (!(k < lc) || (B[j] <= C[k]))) A[i++] = B[j++];
        if((k < lc) && (!(j < lb) || (C[k] < B[j]))) A[i++] = C[k++];
    }// A = B + C in sorted
    delete [] B;
}
template<typename T>
Vector<T>& Vector<T>::operator= (Vector<T> const& V){
    if(_elem) delete [] _elem;
    copyFrom(V._elem, 0, V.size());
    return *this;
}

template<typename T>
T& Vector<T>::operator[] (Rank r) const{
    assert(r >= 0 && r < _size );
    return _elem[r];
}

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

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;
    }
    return (e == A[lo]) ? lo : -1;
}
*/


Reference :

1. 邓俊辉. 数据结构 : C++语言版[M]. 清华大学出版社, 2013.
posted @ 2017-10-09 10:13  Tom_NCU  阅读(461)  评论(0编辑  收藏  举报