2.0-vector(含归并排序)
Posted wsshub
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
以上是关于2.0-vector(含归并排序)的主要内容,如果未能解决你的问题,请参考以下文章
经典十大排序算法(含升序降序,基数排序含负数排序)Java版完整代码建议收藏系列