(仅供参考)王道2020算法题代码2.2(P18-P19)

(仅供参考)王道2020算法题代码2.2(P18-P19))

部分题目写入了次优解或者多种写法。
2.3节传送门

 //静态顺序表 
 typedef struct
 {
 	Elem data[Maxsize];
 	int length;
 }seqlist;
 
 //顺序表插入操作 
bool ListInsert(seqlist &L, Elem e, int i)
{
	if(i < 1 || i > L.length + 1)
		return false;
		
	if(L.length >= Maxsize)
		return false;
		
	else
	{
		for(int k = L.length; k >= i; k--)
			L.data[k] = L.data[k-1];

		L.data[i-1] = e;
		L.length ++;
		
		return true;
	}
 } ;
 
 //顺序表删除操作 
bool ListDelete(seqlist &L, int i, Elem &e)
 {
	if(i < 1 || i > L.length)
		return false;
	
	e = L.data[i-1];
	
	for(int k = i; k <L.length; k++)
		L.data[k-1] = L.data[k];
	L.length--;
	
	return true;
}; 

//按值查找元素

int LocateElem(seqlist &L, Elem e)
{
	for(int k = 0; k <L.length; k++)
		if (L.data[k] == e)
		return k+1;
	
	return 0;
 }; 

//T1

bool Deletemin(seqlist &L, Elem &e)
{
	if(L.length == 0)
		return false;
		
	e = L.data[0];
	int pos;
	for(int k = 1; k < L.length; k++)
	{
		if(L.data[k] < e)
		{
			e = L.data[k];
			pos = k;
		}
	}
	
	L.data[pos] = L.data[L.length];
	L.length--;
	
	return true;
};

//T2
void Reverse(seqlist &L)
{
	Elem e;
	int i,j;
	for(i = 0, j = L.length-1; i < j; i++, j--)
	{
		e = L.data[i];
		L.data[i] = L.data[j];
		L.data[j] = e;
	}
 } ;
 
//T3 
void delx1(seqlist &L, Elem x)
{
	int k = 0;
	for(int i = 0; i < L.length; i++)
	{
		if(L.data[i] = x)
			k++;
		else
			L.data[i-k] = L.data[i];
			
		L.length -= k;
	}
 } ;
void delx2(seqlist &L, Elem x)
{
	int k = 0;			//k为 ≠x的数量;
	
	for(int i = 0; i < L.length; i++)
{
	if(L.data[i] != x)
	{
		L.data[k] = L.data[i];
		k++;
	}
 } 
};

//T4
bool deleterange(seqlist &L, Elem s, Elem t)
{
	if(s >= t || L.length == 0)
		return false;
	
	int i = 0;	int j;
	for(j = 0; L.data[j] <= t; j++)
	{
		if(L.data[j] <= s)
			i++;
	}
	
	for(i = i+1; j < L.length; i++,j++)
		L.data[i] = L.data[j];
		
	L.length = i;
	return true;
};

//T5
bool deleterange5(seqlist &L, int s, int t)
{
	if(s >= t || L.length == 0)
		return false;
		
	int k = 0;
	for(int i = 0; i < L.length; i++)
	{
		if(L.data[i] >= s && L.data[i] <= t)
			k++;
		else
			L.data[i-k] = L.data[i];
	}
	
	L.length -= k;
	
	return true;
 } ;
 
 //T6
 bool deletesame(seqlist &L)
 {
 	if(L.length == 0)
 		return false;
 	
	int k = 0;	
 	for(int i = 1; i < L.length; i++)
 	{
 		if(L.data[i-1] == L.data[i])
 			k++;
 		else
 			L.data[i-k] = L.data[i];
	 }
	 
	 L.length -= k;
	 return true;
  } 
  bool deletesame1(seqlist &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;
  }
  
  //T7
  bool Merge(seqlist L1, seqlist L2, seqlist &L3)
  {
  	if(L1.length + L2.length > Maxsize)
  		return false;
  		
  	int i,j,k;
  	for(i = 0,j = 0,k = 0; i < L1.length || j < L2.length; k++)
  		if(L1.data[i] <= L2.data[j])
  			L3.data[k] = L1.data[i++];
  		else
  			L3.data[k] = L2.data[j++];
  			
  	while(j < L2.length)
  		L3.data[k++] = L2.data[j++];
	while(i < L1.length)
		L3.data[k++] = L1.data[j++];
		
	L3.length = k;
	return true;
  }
  
  //T8
  void Reverse1(Elem a[], int l, int r, int arraysize)
  {
  	if(l >= r || r >= arraysize)
  		return;
  	
  	Elem temp;
  	for(; l < r; l++, r--)
  	{
  		temp = a[l];
  		a[l] = a[r];
  		a[r] = temp;
	}
  }
  
  void Exchange(Elem a[], int m, int n, int arraysize)
  {
  	Reverse1(a, 0, m+n-1, arraysize);
  	Reverse1(a, 0, n-1, arraysize);
  	Reverse1(a, n, m+n-1, arraysize);
  }
  
  //T9
   void LocateExchangeorInsert(Elem a[], int n, Elem e)
   {
   		int low = 0;
		int high = n-1;
		int mid;
   		while(low <= high)
   		{
   			mid = (low + high) / 2;
   			if (a[mid] == e)
   				break;
   			else if (a[mid] < e)
   				low = mid + 1;
   			else
   				high = mid - 1;
		}
		
		if(low > high)						//折半插入算法 
		{
			for(int i = n-1; i > high; i--) //等价于for(int i = n-1; i >= mid; i--)
				a[i+1] = a[i];
			a[high + 1] = e; 
		}
		
		if(a[mid] == e && mid != n-1)
		{
			a[mid] = a[++mid];
			a[mid] = e;
		}
   }
   
   //T10 同T8思路一致 时间复杂度O(n)空间复杂度O(1) 
   void Reserve_T10(Elem a[], int l, int r)
   {
   		Elem temp;
   		for(; l < r; l++, r--)
		{
			temp = a[l];
			a[l] = a[r];
			a[r] = temp;
		}
   }
   
   void Leftmove(Elem a[], int n, int p)
   {
   		Reserve_T10(a, 0, n-1);
   		Reserve_T10(a, 0, n-p-1);
   		Reserve_T10(a, n-p-1, n-1);
   }

//T11 最优解 T(n) = O(log2n) S(n) = O(1); 
int Midsearch(Elem a[], Elem b[], int n)
{
	int s1, d1, s2, d2, m1, m2;
	s1 = 0; s2 = 0; d1 = n-1; d2 = n-1;
	
	while(s1 < d1 || s2 < d2)
	{
		m1 = (s1 + d1) / 2;
		m2 = (s2 + d2) / 2;
		if(a[m1] == b[m2])
			return a[m1];
		else if(a[m1] < b[m2])
		{
			if((s1 + d1) % 2 == 0) //奇数个? 
			{
				s1 = m1;
				d2 = m2;
			}
			else
			{
				s1 = m1 + 1;
				d2 = m2; 
			}
		}
		else
		{
			if((s1 + d1) % 2 == 0) //奇数个? 
			{
				d1 = m1;
				s2 = m2;
			}
			else
			{
				d1 = m1;
				s2 = m2 + 1; 
			}
		}
		 
	}
	return a[s1] < b[s2] ? a[s1] : b[s2];
 } 
 //T11次优解 T(n) = O(n) S(n) = O(1);
int Midsearch2(Elem a[], Elem b[], int n)
{
	int m1 = 0;
	int m2 = 0;
	int m;
	
	while(m1 + m2 +2 <= n)
	{
		if(a[m1] < b[m2])
		{
			m1++;
			m = b[m2];
		}
		else
		{
			m2++;
			m = a[m1];
		}
	}
	
	return m;
}

//T12次优解T(n) = O(n) S(n) = O(n);
int MainElem(int a[], int n)
{
	int b[n] = {0};
	int i = 0;
	for(i = 0; i < n; i++)
	{
		b[a[i]]++;
	}
	
	int max = 0;
	for(i = 1; i < n ; i++)
		if(b[max] < b[i])
			max = i;
	
	if(b[max] > n/2)
		return b[max];
	else
		return -1;
}
//T12最优解 
int MainElem1(int a[], int n)
{
	int count = 1;
	int temp = a[0];
	int i;
	for(i = 1; i < n; i++)
	{
		if(a[i] == temp)
			count++;
		else if(count > 0)
			count--;
		else
			temp = a[i];
			count = 1;
			
	}
	for(i = count = 0; i < n; i++)
		if(a[i] == temp)
			count++;
			
	if(count > n/2)
		return temp;
	else
		return -1;
} 

//T13最优解T(n) = O(n) S(n) = O(n);
int Findmissmin(int a[], int n)
{
	int b[n] = {0};
	int i;
	
	for(i = 0; i < n; i++)
	{
		if(a[i] > 0 && a[i] <= n)
			b[a[i]-1] = 1;
	}
	for(i = 0; i < n; i++)
	{
		if(b[i] == 0)
			return i+1;
	}
	
	return i+1;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值