数据结构、算法与应用答案第五章21-30

22:
	 void reverse(){
		 for (i = 0; i != listSize / 2; ++i) {
			 T p = element[i];
			 element[i] = element[listSize - i - 1];
			 element[listSize - i - 1] = p;
		 }
	 }

2)复杂度因为只有一个循环,因此是O(listSize)

23:

	 //线性表左移i个位置
	 void leftShift(int i) {
		 if (i > listSize) {
			 ostringstream s;
			 s << "listSize=" << listSize << "I=" << i;
			 cout << s.str();
		 }
		 copy(element + i, element + listSize, element);
		 listSize = listSize - i;
		 element[listSize].~T();
	}
24:
	 //循环移动按照顺时针方向。
	 void circularShift(int i){
		 T* temp = new T[arrayLength];
		 copy(element + i, element + listSize, temp);
		 copy(element, element + i, temp + listSize - i);
		 delete []element;
		 element = temp;
	 }

25:

	 //隔一个删除一个元素
	 void half() {
		 T* temp = new T[arrayLength];
		 for (int i = 0; i !=listSize / 2+1; ++i) {
			 temp[i] = element[2*i];
		 }
		 delete []element;
		 element = temp;
		 listSize = listSize / 2;
	 }

2)因为代码的循环次数只跟listSize有关,所以他的复杂度是O(listSize)

26:

实现上并没有多大差别,只是把temp改成了insert,把【】改成了get

27:加上以下功能

		iterator& operator +(int i) const {
			return *position + i;
		}
		iterator& operator -(int i) const {
			return *position - i;
		}
		iterator& operator +=(int i) const {
			position + i;
			return *this;
		}
		iterator& operator -=(int i) const {
			position - i;
			return *this;
		}
		iterator& operator -(iterator right) const {
			int i,j;
			i = position - element;
			j = right.position - element;
			return i - j;
		}
		T& operator*() const { return *position; }
		T* operator->() const { return &*position; }


28:

	//求两个线性表按照一定规律的排列
	arraylist<T> meld(arraylist<T> a, arraylist<T> b) {
		listSize = a.listSize + b.listSize;
		if (a.listSize > b.listSize) {
			int i = b.listSize;
			int j;
			for (j = 0; j != i * 2; ++j) {
				if (j % 2 == 0) {
					element[j] = a[j / 2];
				}
				element[j] = b[j / 2];
			}
			copy(a.element + i, a.element + a.listSize, element + j);
		}
		else {
			int i = a.listSize;
			int j;
			for (j = 0; j != i * 2; ++j) {			
				if (j % 2 == 0) {
					element[j] = a[j/2];
				}
				else {
					element[j] = b[j/2];
				}
			}
			copy(b.element + i, b.element + b.listSize, element + j);
		}
		return *this;
	}

因为是首先先需要进行二倍min(a.listSize,b.listSize)次移动,然后再用COPY函数进行MAX-min次移动,所以是MAX+MIN次移动,因此复杂度位O(max+min)

29:

//求两个非递减有序的线性表的集合
	arraylist<T> merge(arraylist<T> a, arraylist<T> b) {
		int i, j=0;
		listSize = 0;
		for ( i = 0; i != a.listSize; ++i) {
			for ( ; j != b.listSize; ++j) {
				if (b.element[j] > a.element[i]) {
					element[i + j] = a.element[i];
					listSize++;
					break;
				}
				element[i + j] = b.element[j];
				listSize++;
			}
		}
		if (j == b.listSize) {
			copy(a.element + listSize - j, a.element + i + j, element + listSize);
		}
		else {
			copy(b.element + listSize - i, b.element + a.listSize + b.listSize, element + listSize);
		}
		listSize = a.listSize + b.listSize;
		return *this;
	}

复杂度为O(a.listSize*b.listSize)

30:

	void split(arraylist<T>& a, arraylist<T>& b) {
		for (int i = 0; i != listSize; ++i) {
			if (i % 2 == 0) {
				a.element[i / 2] = element[i];
			}
			else {
				b.element[i / 2] = element[i];
			}
		}
		b.listSize = listSize / 2;
		if (listSize % 2 == 0) {
			a.listSize = listSize / 2;
		}
		else
			a.listSize = listSize / 2 +1;
	}

复杂度显然为O(listSize)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值