数据结构与算法分析第一次作业题解

仅供参考,学习交流,如有雷同,你抄我的

本次作业顺序表全部由数组实现,在此对每道题目列出两种做法,但不赘述所有方法,仅供大家了解算法优化,拓展思维。

1.

//对顺序表A插入一个值,使其仍为顺序表
//顺序表数组实现,二分查找位置 
//#include<bits/stdc++.h>
#include<cstdio>
#include<iostream> 
using namespace std;
void init(int *a,int l){
	cout<<"请输入长度为5的数组,预置插入的数为7"<<endl; 
	for(int i = 0;i < l;i++)
		cin>>a[i];
	return;	
} 
int Find(int num,int *a,int l){
	int lef = 0,rig = l-1,mid = (lef+rig)/2;
	while(lef+1 < rig){
		if(a[lef] <= num)return lef;
		if(a[rig] >= num)return rig + 1;
		if(a[mid] == num)return mid;
		if(a[mid] < num)rig = mid,mid = (lef+rig)/2;
		else lef = mid,mid = (lef+rig)/2;
	}
	if(a[mid] > num && a[mid + 1] < num)
		return mid + 1;
	else return mid;
}
void insert(int num,int*a, int p,int l){
	for(int i = l;i > p;i--)
		a[i] = a[i - 1];
	a[p] = num;
	return;
}
void print(int *a,int l){
	for(int i = 0;i <= l;i++)
		cout<<a[i]<<" ";
	return;
}
int main(){
	int A[1000],len = 5,t = 7,pos = -1;//初始化数据,len为长度,t为插入的数 
	init(A,len);
	pos = Find(t,A,len);
	insert(t,A,pos,len);
	print(A,len);
	return 0;
}
//对顺序表A插入一个值,顺序查找位置 
//#include<bits/stdc++.h>
#include<cstdio>
#include<iostream> 
using namespace std;
void init(int *a,int l){
	cout<<"请输入长度为5的数组,预置插入的数为7"<<endl; 
	for(int i = 0;i < l;i++)
		cin>>a[i];
	return;	
} 
int Find(int num,int *a,int l){
	for(int i = 0;i < l;i++)
		if(a[i] < num)
			return i;
	return l;
}
void insert(int num,int*a, int p,int l){
	for(int i = l;i > p;i--)
		a[i] = a[i - 1];
	a[p] = num;
	return;
}
void print(int *a,int l){
	for(int i = 0;i <= l;i++)
		cout<<a[i]<<" ";
	return;
}
int main(){
	int A[1000],len = 5,t = 7,pos = -1;//初始化数据,len为长度,t为插入的数 
	init(A,len);
	pos = Find(t,A,len);
	insert(t,A,pos,len);
	print(A,len);
	return 0;
}

2.

//删除顺序表中重复的元素
//再开一个数组,O(n)做法 
#include<iostream>
#include<cstdio>
using namespace std;
void init(int *a,int*l){
	cout<<"请输入数列长度"<<endl;
	cin>>(*l); 
	cout<<"请输入数列"<<endl; 
	for(int i = 0;i < (*l);i++)
		cin>>a[i];
}
int del(int *a,int *ans,int l){
	int mar = 0;
	ans[mar] = a[0];
	for(int i = 1;i < l;i++){
		if(a[i] == ans[mar])continue;
		else ans[(++mar)] = a[i];
	}
	return mar;	
}
int main(){
	int a[5500],ans[5500],len;
	init(a,&len);
	int mar = del(a,ans,len);
	for(int i = 0;i <= mar;i++)
		cout<<ans[i]<<" ";
	return 0;
}
//删除顺序表中重复的元素
//仅使用原数组,O(n2)做法 
//时间换空间的特点 
#include<iostream>
#include<cstdio>
using namespace std;
void init(int *a,int*l){
	cout<<"请输入数列长度"<<endl;
	cin>>(*l); 
	cout<<"请输入数列"<<endl; 
	for(int i = 0;i < (*l);i++)
		cin>>a[i];
}
int del(int *a,int *l){
	for(int i = 0;i < *l - 1;i++)
		while(a[i] == a[i + 1]){
			for(int j = i+1;j <= *l - 1;j++)
				a[j] = a[j + 1];
			(*l)--;
		}
}
int main(){
	int a[5500],len;
	init(a,&len);
	del(a,&len);
	for(int i = 0;i < len;i++)
		cout<<a[i]<<" ";
	return 0;
}

3.

//逆置顺序表
//使用一个临时变量应该也可以,但可以通过简单的加减法完全不使用额外的空间 
//加减改成乘除也可以 
#include<iostream>
#include<cstdio>
using namespace std;
void deal(int * a,int l){
	for(int i = 0;i < l/2;i++)
		a[i]+=a[l-1-i], a[l-1-i] = a[i] - a[l-1-i],a[i]-=a[l-i-1];
}
int main(){
	int a[10000],len;
	cout<<"请输入数组长度"<<endl;
	cin>>len;
	cout<<"请输入数列"<<endl;
	for(int i = 0;i < len;i++) 
		cin>>a[i];
	deal(a,len);
	for(int i = 0;i < len;i++)
		cout<<a[i]<<" ";
	return 0;
} 
//逆置顺序表
//加减可以改为异或运算,其实时间复杂度上差异不大 
#include<iostream>
#include<cstdio>
using namespace std;
void deal(int * a,int l){
	for(int i = 0;i < l/2;i++)
		a[i]^=a[l-1-i], a[l-1-i] ^= a[i],a[i]^=a[l-i-1];
}
int main(){
	int a[10000],len;
	cout<<"请输入数组长度"<<endl;
	cin>>len;
	cout<<"请输入数列"<<endl;
	for(int i = 0;i < len;i++) 
		cin>>a[i];
	deal(a,len);
	for(int i = 0;i < len;i++)
		cout<<a[i]<<" ";
	return 0;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值