约定顺序表结构体:
typedf struct{
int data[MaxSize];
int len;
}SqList;
1、顺序表递增有序,插入元素x,仍递增有序
int find(SqList L,int x){
int i = 0;
while(L.data[i] != x){
i++;
}
return i;
}
bool Insert(SqList &L,int x){
int p = find(L,x);
if(p>=MaxSize||L.len >= MaxSize)//溢出插入失败
return false;
for(int j = len; j>=i ; j--){
L.data[j]=L.data[j-1];
}
L.data[p-1] = x;
L.length +=1;//注意不要遗漏
return true;
}
2、用顺序表最后一个元素覆盖整个顺序表中最小元素,并返回该最小值
//思路:首先遍历顺序表找出最小元素,记下位置后用最后一个元素替换
int Replace_Min(SqList &L){
int p = 0;
int min = L.data[0];
for(int i=0 ; i<len ;i++){
if(L.data[i] < min){
min = L.data[i];
p = i;}
}
L.data[p] = L.data[len-1];
return min;
}
思考:有多个相同的最小值如何解?
3、将顺序表中的元素逆置
void Reverse(SqList &L){
int temp = 0;
for(int i=0, j=len-1; i<j ;i++,j--){
temp = L.data[i];
L.data[i] = L.data[j];
L.data[j] = temp;
}
}
4、将(a1,a2,a3......am,b1,b2,b3...bn)转换成(b1,b2,b3...bn,a1,a2,a3...am)
//思路:先逆置整个数组,再分别逆置子数组
void Reverse(int A[], int m, int n){
int temp = 0;
for(int i=m, j=n-1; i<j ;i++,j--){
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
void Exchange(int A[], int m,int n){
Reverse(A,0,m+n-1);
Reverse(A,0,n-1);
Reverse(A,n,n+m-1);
}
5、删除顺序表中所有值为x的元素
//思路:遍历顺序表,查找值为x的元素,设置变量记录x的个数,以便删除时元素前移相应位数
void Del(SqList &l,int x){
int k = 0;
for(int i = 0 ; i<len ; i++){
if(L.data[i] == x)
k++;
else
L.data[i-k] = L.data[i];
}
L.len -=k;
}
6、从顺序表中删除给定值在s到t之间(包含s和t)的所有元素
bool Delpart(SqList &L,int s,int t){
int k = 0;
if(s>=t || L.len==0 )
return false;
for(int i=0 ;i<L.len ;i++){
if(L.data[i]>=s && L.data[i]<=t)
k++;
else
L.data[i-K] = L.data[i]; //注意
}
L.len -=k;
return ture;
}
7、两个递增有序表合并成一个递增有序表
bool Merge(SqList A,SqList B,SqList &C){
int i=0,j=0,k=0;
if(C.len >= (B.len + C.len))
return false;
while(i<A.len && j<B.len){
if(A.data[i]<B.data[j])
C.data[k]=A.data[i];
else
C.data[k]=B.data[j];
i++;j++;k++;
}
while(i<A.len){
C.data[k]=A.data[i];
i++;k++;
}
while(j<B.len){
C.data[k]=B.data[j];
j++;k++;
}
return true;
}
8、从有序表中删除所有值重复的元素
bool Del(SqList &L){
int i=0,j=1;
for(i,j; j<L.len; j++){
if(L.data[i]!=L.data[j]){
L.data[++i]=L.data[j]
}
}
L.len = i+1;
return true;
}
9、求两个递增序列合并后的中位数(长度为L的升序序列S,在第(L/2)个位置的数称为S的中位数,注意:向下取整,也就是说L=5,则第三个是中位数,两个序列的中位数是指两个序列合并后的的中位数。)
int find(SqList A,SqList B){
int i,j,k;
i=j=k=0;
SqList C;
while(i<A.len && j<B.len){
if(A.data[i]<B.data[j]){
C.data[k++] = A.data[i++];
}
else
C.data[k++] = B.data[j++];
}
while(i<A.len){
C.data[k++] = A.data[i++];
}
while(j<B.len){
C.data[k++] = B.data[j++];
}
C.len = A.len+B.len;
return C.data[(C.len-1)/2];
}
10、设计出一个时间上尽可能高效的算法,找出数组中未出现的最小正整数
int Find(intA[], int n){
int i;
int *N=new int[n];
for(int k=0;k<n;++k){
if(A[i]>0&&A[i]<=n)
B[A[i]-1]=1;
}
for(i=0;i<n;++i){
if(B[i] == 0)
break;
}
delete[] B;
return i+1;
}