2.0-vector(含归并排序)

向量的基本实现和操作,含归并排序。

  1 #include<iostream>
  2 using namespace std;
  3 typedef int ElemType;
  4 #define DEFAULT_CAPACITY 10
  5 
  6 class Vector{
  7     public:
  8     int _size;//实际规模 
  9     int _capacity;//容量 
 10     ElemType *_elem;//数组 
 11     Vector(int c=DEFAULT_CAPACITY,int s=0,ElemType v=0)//建立一个容量为c,规模为s,所有元素为v的数组 
 12     {
 13         _elem=new ElemType[_capacity=c];
 14         for(_size=0;_size<s;_elem[_size++]=v) ;
 15     }
 16     ~Vector()//析构函数 
 17     {
 18     delete []_elem;
 19     _elem=NULL;
 20     }
 21     void expand(){
 22         if(_size<_capacity)return;
 23         if(_capacity<DEFAULT_CAPACITY)_capacity=DEFAULT_CAPACITY;
 24         ElemType *old=_elem;
 25         _elem=new ElemType[_capacity<<=1];
 26         for(int i=0;i<_size;i++){
 27             _elem[i]=old[i];
 28         }
 29         delete []old;
 30         old=NULL;
 31     } 
 32     void shrink(){
 33         if(_capacity<DEFAULT_CAPACITY<<1)return;
 34         if(_size<<2>_capacity)return;
 35         ElemType *old=_elem;
 36         _elem=new ElemType[_capacity>>=1];
 37         for(int i=0;i<_size;i++)_elem[i]=old[i];
 38         delete []old;
 39         old=NULL;
 40     }
 41     int find(ElemType e,int lo,int hi)//0<=lo<hi<=_size;查找[lo,hi)区间 
 42     {
 43         while(lo<hi--){
 44             if(_elem[hi]==e)
 45             return hi; 
 46         }//循环结束还未返回,没查找成功。lo=hi跳出循环,由于hi--,hi=hi-1=lo-1 
 47         return hi;
 48     }
 49     int insert(int r,ElemType e){
 50         expand();
 51         for(int i=_size;i>r;i--)
 52             _elem[i]=_elem[i-1];
 53         
 54         _elem[r]=e;_size++;
 55         return r;
 56     }
 57     int remove(int lo,int hi){
 58         if(lo==hi)return 0;
 59         while(hi<_size)
 60         _elem[lo++]=_elem[hi++];
 61         _size=lo;
 62         shrink();
 63         return hi-lo;
 64     }
 65     int remove(int r){
 66         ElemType e=_elem[r];
 67         remove(r,r+1);
 68         return e;
 69     }
 70     int deduplicate(){//无序向量唯一化 
 71         int oldsize=_size;
 72         int i=1;
 73         while(i<_size)
 74             (find(_elem[i],0,i)<0)?i++:remove(i);
 75         return oldsize-_size;
 76     }
 77     int uniquify(){//有序向量唯一化 
 78         int i=0,j=0;
 79         while(++j<_size)
 80         if(_elem[i]!=_elem[j])
 81         _elem[++i]=_elem[j];
 82         
 83         _size=++i;
 84         shrink();
 85         return j-i;
 86     } 
 87     
 88     void mergeSort(int lo,int hi){
 89         if(hi-lo<2)return;
 90         int mi=(lo+hi)/2;
 91         mergeSort(lo,mi);
 92         mergeSort(mi,hi);
 93         merge(lo,mi,hi);
 94     }
 95     void merge(int lo,int mi,int hi)
 96     {
 97         ElemType*A=_elem+lo;
 98         int lb=mi-lo;
 99         ElemType *B=new ElemType[lb];
100         for(int i=0;i<lb;B[i]=A[i++]);
101         
102         int lc=hi-mi;
103         ElemType *C=_elem+mi;
104         
105         for(int i=0,j=0,k=0;(j<lb)||(k<lc);){
106              if( (j<lb)&&( (k>=lc)||(B[j]<C[k]) )    ) A[i++]=B[j++];
107              if(  (k<lc)&&( (j>=lb)||C[k]<B[j]  )   )  A[i++]=C[k++];            
108         }
109         delete []B;
110     }
111     void print(){
112         for(int i=0;i<_size;i++)
113         cout<<_elem[i]<<" ";
114         cout<<endl<<endl;
115     }
116 };
117 
118 
119 
120 int main(){
121     Vector data(15,10,5);
122     data.print();
123     data.insert(5,2);
124     data.insert(5,8);
125     data.insert(5,7);
126     data.insert(5,4);
127     data.insert(5,3);
128     data.print();
129     data.deduplicate();
130     data.print();
131     return 0;
132 }

猜你喜欢

转载自www.cnblogs.com/wsshub/p/12361395.html