#include
#include
#include
#define maxn 100
typedef int Elemtype;
typedef struct
{
Elemtype data[maxn];
int len;
} SqList;
bool Del_Min(SqList *L,Elemtype *e)
{
if(L->len==0)return false;
*e=L->data[0];
int pos=0;
for(int i=0; i<L->len; i++)
{
if(L->data[i]<*e)
{
*e=L->data[i];
pos=i;
}
}
L->data[pos]=L->data[L->len-1];
L->len--;
return true;
}
int main()
{
SqList L;
L.len=0;
for(int i=0; i<=10; i++)
{
L.data[i]=i;
L.len++;
}
L.data[5]=-99;//最小元素
int k;
Del_Min(&L,&k);
printf("%d",k);//-99
return 0;
}
#include
#include
#include
#define maxn 100
typedef int Elemtype;
typedef struct
{
Elemtype data[maxn];
int len;
} SqList;
bool Reverse(SqList *L)
{
if(L->len==0)return false;
Elemtype t;
for(int i=0;i<L->len/2;i++)
{
//交换变量
t=L->data[i];
L->data[i]=L->data[L->len-i-1];
L->data[L->len-i-1]=t;
}
return true;
}
int main()
{
SqList L;
L.len=0;
for(int i=0; i<=10; i++)
{
L.data[i]=i;
L.len++;
}
Reverse(&L);
for(int i=0; i<=10; i++)
{
printf("%d ",L.data[i]);//10 9 8 7 6 5 4 3 2 1
}
return 0;
}
#include
#include
#include
#define maxn 100
typedef int Elemtype;
typedef struct
{
Elemtype data[maxn];
int len;
} SqList;
void del_x_1(SqList *L,Elemtype e)
{
int k=0;
//将不等e的元素挑选出来
for(int i=0;i<L->len;i++)
{
if(L->data[i]!=e)
{
L->data[k]=L->data[i];
k++;
}
}
L->len=k;
}
void del_x_2(SqList *L,Elemtype e)
{
int k=0;
//移动思维
for(int i=0;i<L->len;i++)
{
if(L->data[i]==e)k++;
else{
L->data[i-k]=L->data[i];//向前移动
}
}
L->len-=k;
}
int main()
{
SqList L;
L.len=0;
for(int i=0; i<=10; i++)
{
L.data[i]=i;
L.len++;
}
L.data[2]=-99;
L.data[3]=-99;
//del_x_1(&L,-99);
del_x_2(&L,-99);
for(int i=0; i<L.len; i++)
{
printf("%d ",L.data[i]);
}
return 0;
}
#include
#include
#include
#define maxn 100
typedef int Elemtype;
typedef struct
{
Elemtype data[maxn];
int len;
} SqList;
/*顺序表有序*/
bool Del_s_t(SqList *L,int s,int t)
{
if(L->len==0)return false;
if(s>=t) return false;
int i,j;
//找到大于等于s的第一个值
for(i=0; i<L->len&&L->data[i]<s; i++);
if(i>=L->len)return false;
//找到大于t的第一个值
for(j=i; j<L->len&&L->data[j]<=t; j++);
//双指针法(将j后面的元素全部移动到i后面)
for(; j<L->len; i++,j++)
{
L->data[i]=L->data[j];
}
L->len=i;
return true;
}
int main()
{
SqList L;
L.len=0;
for(int i=0; i<10; i++)
{
L.data[i]=i+1;
L.len++;
}
Del_s_t_2(&L,2,4);
for(int i=0; i<L.len; i++)
{
printf("%d ",L.data[i]);// 1 5 6 7 8 9
}
return 0;
}
#include
#include
#include
#define maxn 100
typedef int Elemtype;
typedef struct
{
Elemtype data[maxn];
int len;
} SqList;
bool Del_s_t1(SqList *L,Elemtype s,Elemtype t)
{
if(L->len==0||s>=t)return false;
int k=0;
for(int i=0; i<L->len; i++)
{
if(L->data[i]<s||L->data[i]>t)
{
L->data[k]=L->data[i];
k++;
}
}
L->len=k;
return true;
}
bool Del_s_t2(SqList *L,Elemtype s,Elemtype t)
{
if(L->len==0||s>=t)return false;
int k=0;
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 true;
}
int main()
{
SqList L;
L.len=0;
for(int i=0; i<10; i++) //10 2 3 4 5 2 1 2 1 3
{
scanf("%d",&L.data[i]);
L.len++;
}
//Del_s_t1(&L,2,4);
Del_s_t2(&L,2,4);
for(int i=0; i<L.len; i++)
{
printf("%d ",L.data[i]);
}
return 0;
}
#include
#include
#include
#define maxn 100
typedef int Elemtype;
typedef struct
{
Elemtype data[maxn];
int len;
} SqList;
//双指针逐渐像前移动
bool Delete_Same(SqList *L)
{
if(L->len==0)return false;
int i,j;
for(i=0,j=1;j<L->len;j++)
{
if(L->data[i]!=L->data[j])
{
L->data[++i]=L->data[j];
}
}
L->len=i+1;//下标从0开始所以+1
return true;
}
int main()
{
SqList L;
L.len=0;
for(int i=0; i<10; i++) //1 2 2 3 3 4 4 5 5 6
{
scanf("%d",&L.data[i]);
L.len++;
}
Delete_Same(&L);
for(int i=0; i<L.len; i++)
{
printf("%d ",L.data[i]);
}
return 0;
}
#include
#include
#include
#define maxn 100
typedef int Elemtype;
typedef struct
{
Elemtype data[maxn];
int len;
} SqList;
bool Merge(SqList *A,SqList *B,SqList *C)
{
if(A->len+B->len>maxn)return false; //C的最大长度为100
int i=0,j=0,k=0;
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=k;
return true;
}
int main()
{
SqList A,B,C;
A.len=0,B.len=0,C.len=0;
for(int i=0; i<10; i++) //1 2 3 4 5 6 7 8 9 10
{
scanf("%d",&A.data[i]);
A.len++;
}
for(int i=0; i<10; i++) //1 2 3 4 5 6 7 8 9 10
{
scanf("%d",&B.data[i]);
B.len++;
}
Merge(&A,&B,&C);
for(int i=0; i<C.len; i++)
{
printf("%d ",C.data[i]);
}
return 0;
}
#include
#include
#include
#define maxn 100
typedef int Elemtype;
typedef struct
{
Elemtype data[maxn];
int len;
} SqList;
typedef int DataType;
void Reverse(DataType A[],int left,int right,int arraySize)
{
if(left>=right||right>=arraySize)return false;
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,arraySize);//整体逆转
Reverse(A,0,n-1,arraySize);//an......a1逆转
Reverse(A,n,m+n-1,arraySize);//bn....b1逆转
}
int main()
{
int a[maxn];
for(int i=0; i<20; i++) // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
{
scanf("%d",&a[i]);
}
Exchange(a,10,10,20);
for(int i=0; i<20; i++)
{
printf("%d ",a[i]);
}
return 0;
}
#include
#include
#include
#define maxn 100
typedef int Elemtype;
typedef struct
{
Elemtype data[maxn];
int len;
} SqList;
typedef int DataType;
void SearchExchangeInsert(Elemtype A[],Elemtype e,int len)
{
int l=0,r=len-1,mid;
while(l<=r)
{
mid=(l+r)/2;
if(A[mid]==e)break;
else if(A[mid]<e)
{
l=mid+1;
}
else
{
r=mid-1;
}
}
if(A[mid]==e&&mid!=len-1)
{
int t=A[mid];
A[mid]=A[mid+1];
A[mid+1]=t;
}
if(l>r)
{
int i;
for( i=len-1; i>r; i--)
{
A[i+1]=A[i];
}
A[i+1]=e;
}
}
int main()
{
int a[maxn];
for(int i=0; i<10; i++) // 1 2 3 4 4 6 7 8 9 10
{
scanf("%d",&a[i]);
}
SearchExchangeInsert(a,5,10);
for(int i=0; i<11; i++)
{
printf("%d ",a[i]);
}
return 0;
}
#include
#include
#include
#define maxn 100
typedef int Elemtype;
typedef struct
{
Elemtype data[maxn];
int len;
} SqList;
typedef int DataType;
void Reverse(Elemtype A[],int l,int r)
{
int mid=(l+r)/2;
for(int i=0; i<=mid-l; i++)
{
Elemtype t=A[l+i];
A[l+i]=A[r-i];
A[r-i]=t;
}
}
void Conserve(Elemtype A[],int p,int n)
{
Reverse(A,0,n-1);
Reverse(A,0,n-p-1);
Reverse(A,n-p,n-1);
}
int main()
{
int a[maxn];
for(int i=0; i<10; i++) // 1 2 3 4 5 6 7 8 9 10
{
scanf("%d",&a[i]);
}
Conserve(a,4,10);
for(int i=0; i<10; i++)
{
printf("%d ",a[i]);
}
return 0;
}
第一种时间O(n),空间O(n)
#include
#include
#include
#define maxn 100
typedef int Elemtype;
typedef struct
{
Elemtype data[maxn];
int len;
} SqList;
typedef int DataType;
void Merge(Elemtype A[],Elemtype B[],Elemtype C[],int len1,int len2)
{
int i=0,j=0,k=0;
while(i<len1&&j<len2)
{
if(A[i]<=B[j])
{
C[k++]=A[i++];
}
else
{
C[k++]=B[j++];
}
}
while(i<len1)
{
C[k++]=A[i++];
}
while(j<len2)
{
C[k++]=B[j++];
}
}
Elemtype FindMiddle(Elemtype A[],Elemtype B[],int len1,int len2)
{
Elemtype C[len1+len2];
Merge(A,B,C,len1,len2);
return C[(len1+len2)/2-1];
}
int main()
{
int a[maxn];
int b[maxn];
for(int i=0; i<5; i++) // 1 3 5 7 9
{
scanf("%d",&a[i]);
}
for(int i=0; i<5; i++) // 2 4 6 8 10
{
scanf("%d",&b[i]);
}
printf("%d",FindMiddle(a,b,5,5));
return 0;
}
第二种复杂度O(n),空间O(1)
根据归并排序思想,并不需要开数组存放,只需要连个指针相互比较即可!
#include
#include
#include
#define maxn 100
typedef int Elemtype;
typedef struct
{
Elemtype data[maxn];
int len;
} SqList;
typedef int DataType;
Elemtype M_Search(Elemtype A[],Elemtype B[],int len1,int len2)
{
int i=0,j=0,k=1;
while(i<len1&&j<len2)
{ //归并排序,哪一个元素小哪一个元素就上去,然后k++
if(A[i]<=B[j])
{
if(k==((len1+len2)/2))return A[i];
i++;
}
else
{
if(k==((len1+len2)/2))return B[j];
j++;
}
k++;
}
}
int main()
{
int a[maxn];
int b[maxn];
for(int i=0; i<5; i++) // 1 3 5 7 9
{
scanf("%d",&a[i]);
}
for(int i=0; i<5; i++) // 2 4 6 8 10
{
scanf("%d",&b[i]);
}
printf("%d",M_Search(a,b,5,5));
return 0;
}
#include
#include
#include
#define maxn 100
typedef int Elemtype;
typedef struct
{
Elemtype data[maxn];
int len;
} SqList;
typedef int DataType;
Elemtype Find_MainElem(Elemtype A[],int len)
{
int count=1, c;
c=A[0];
for(int i=1; i<len; i++)
{
if(c==A[i])count++;//和主元素相同则++
else
{
if(count>0)count--;//抵消
else
{
count=1;
c=A[i];//更换新主元素
}
}
}
count=0;//统计主元素出现次数
for(int i=0; i<len; i++)
{
if(c==A[i])
{
count++;
}
}
if(count>len/2)return c;
return -1;
}
int main()
{
int a[maxn];
int b[maxn];
for(int i=0; i<8; i++) // 0 5 5 3 5 7 5 5 ; 0 5 5 3 5 1 5 7
{
scanf("%d",&a[i]);
}
printf("%d",Find_MainElem(a,8));
return 0;
}
最简单的思路就是暴力O(n3)复杂度枚举不同三元组,也可以用散列表O(n)复杂度,空间O(n)
#include
#include
#include
#define maxn 100
typedef int Elemtype;
typedef struct
{
Elemtype data[maxn];
int len;
} SqList;
typedef int DataType;
Elemtype Find_Min(Elemtype A[],int n)
{
int *vis;
vis=(int *)malloc(sizeof(int)*n);//分配空间
for(int i=0;i<n;i++)
{
vis[i]=0;
}
for(int i=0; i<n; i++)
{
if(!vis[A[i]]&&A[i]>0)vis[A[i]-1]=1;
}
for(int i=0; i<n; i++)
{
if(!vis[i])
{
return i+1;
}
}
return n+1;
}
int main()
{
int a[maxn];
int b[maxn];
for(int i=0; i<3; i++) // -5 3 2 3 ; 1 2 3
{
scanf("%d",&a[i]);
}
printf("%d",Find_Min(a,3));
return 0;
}
简单分析,距离和S1 S2 S3中最小元素和最大元素的值有关,D=2*(max-min), 由于序列为升序,所以不断向上枚举,将min的值,变大,这样D就越来越小
#include
#include
#include
#define INT_MAX 0x7f7f7f7f
typedef int Elemtype;
int abs_(int a)
{
if(a<0)return -a;
return a;
}
bool xls_min(int a,int b,int c) //判断三个数a是否是最小
{
if(a<=b&&a<=c)return true;
return false;
}
int findMinnoTrip(int A[],int n,int B[],int m,int C[],int p)
{
int i=0,j=0,k=0,D_min=INT_MAX,D;
while(i<n&&j<m&&k<p&&D_min>0)
{
D=abs_(A[i]-B[j])+abs_(A[i]-C[k])+abs_(B[j]-C[k]);
if(D_min>D)D_min=D;
if(xls_min(A[i],B[j],C[k]))
{
i++; //将距离缩短
}
else if(xls_min(B[j],A[i],C[k]))
{
j++;
}
else
{
k++;
}
}
return D_min;
}
int main()
{
int a[10];
int b[10];
int c[10];
for(int i=0; i<3; i++) // -1 0 9
{
scanf("%d",&a[i]);
}
for(int i=0; i<4; i++) // -25 -10 10 11
{
scanf("%d",&b[i]);
}
for(int i=0; i<5; i++) // 2 9 17 30 41
{
scanf("%d",&c[i]);
}
printf("%d",findMinnoTrip(a,3,b,4,c,5));
return 0;
}