王道數據結構考研之順序表練習題

1、設計一個高效算法,將順序表L的所有元素逆置,要求算法的空間複雜度爲O(1)

	void Reverse(SqList &L){
		ElemType temp;//輔助變量
		for(int i=0;i<L.length/2;i++){
			temp=L.data[i];
			L.data[i]=L.data[L.length-i-1];
			L.data[L.length-i-1]=temp;
		}
	}

2、對於長度爲n的順序表L,編寫一個時間複雜度爲O(n),空間複雜度爲O(1)的算法,該算法刪除線性表中所有值爲x的數據元素。

	算法思想:用k記錄順序表L中等於x的元素個數,邊掃描L邊統計k,並將不等於x
的元素前移k個位置,最後修改L的長度
	void del_x(SqList &L,ElemType x){
		int k=0,i=0;
		while(i<L.length){
			if(L.data[i]==x){
				k++;
			}else{
				L.data[i-k]=L.data[i];//元素前移k個位置
			}
			i++;
		}
		L.length=L.length-k;//L長度減短k
	}

3、從順序表中刪除值在s和t之間的所有元素,如果s和t不合理,顯示錯誤信息並退出。

	算法思想:從前向後掃描順序表L,用k記錄下元素值在s和t之間的個數,不在s
和t之間的,則前移k個位置
	bool del_s_t(SqList &L,ElemType s,ElemType t){
		int i,k=0;
		if(L.length==0 || s>=t) return false;
		for(i=0;i<L.length;i++){
			if(L.data[i]>=s && L.data[i]=<t)
				k++;
			else
				L.data[i-k]=L.data[i];//當前元素前移k個位置	
		}
		L.length -= k;
		return true;
	}

4、從有序的順序表中刪除所有的重複的元素,使得順序表的元素不重複

	算法思想: 使用類似於直接排序的思想,初始時將第一個元素視爲非重複的有
序表,之後依次判斷與前面的最後一個元素是否相同。
	bool del_same(SqList &L){
		if(L.length==0) return false;
		int i,j;
		for(i=0,j=1;j<L.length;j++){
			if(L.data[i]!=L.data[j]) 
				L.data[++i] = L.data[j];
		}
		L.length=i+1;
		return true;
	}

5、將兩個有序表合併成一個有序表

	算法思想:按順序不斷取下兩個順序表的較小的元素放入新的順序表中,然後
看哪個表有剩餘,將剩餘部分加到新的順序表後面。
	bool Merge(SqList A, SqList B, SqList &C){
		if(A.length+B.length>C.MaxSize) return false;
		int i=0,j=0,k=0;
		while(i<A.length && j<B.length){//較小的加入新順序表
			if(A.data[i]<=B.data[j]) C.data[k++] = A.data[i++];
			else C.data[k++] = B.data[j++];
		}
		//剩餘加入新順序表
		while(i<A.length) C.data[k++] = A.data[i++];
		while(j<B.length) C.data[k++] = B.data[j++];
		C.length=k;
		return true;
	}

6、已知在一維數組A[m+n]中依次存放兩個線性表(a1,a2…,am)和(b1,b2…,bn),編寫算法將兩個線性表位置對換成(b1,b2,…bn,a1,a2,…am)

	算法思想:先把整個數組反轉逆置成[bn,...b2,b1,am,...a2,a1],再對前n個
和後m個原地逆置。
	typedef int DataType;
	void Reverse(DataType A[], int left, int right, int arraySize){
		if(left>=right || right>=arraySize) return ;
		int mid=(left+right)/2;
		for(int i=0;i<=mid-left;i++){
			DataType temp=A[left+i];
			A[left+i]=A[right-i];
			A[right-i]=temp;
		}
	}
	void Exchange(DataType A[],int m,int n,int arraySize){
		Reverse(A,0,m+n-1,srraySize);
		Reverse(A,0,n-1,arraySize);
		Reverse(A,n,m+n-1,arraySize);
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章