//个人粗糙整理,由于不断调试,代码略显粗糙,请见谅。
#include <stdio.h>
#include <malloc.h>#define maxsize 50
typedef int elemtype;
typedef struct //定义顺序表的存储类型
{
elemtype data[maxsize];
int length;
}sqlist;//2.2.1
bool del_Min(sqlist &q,elemtype e){
if(q.length==0) return false;
e=q.data[0];
int temp=0;
for(int i=1;i<q.length;i++){
if(q.data[i]<e){
e=q.data[i];
temp=i;
}
}
q.data[temp]=q.data[q.length-1];
q.length--;
return true;
}//2.2.2
void Reverse(sqlist &q){elemtype temp;
for(int i=0;i<q.length/2;i++){
temp=q.data[i];
q.data[i]=q.data[q.length-i-1];
q.data[q.length-i-1]=temp;
}
}//2.2.3
void del_x(sqlist &q,elemtype x){
int k=0;
for(int i=0;i<q.length;i++){
if(q.data[i]==x) k++;
else q.data[i-k]=q.data[i];
}
q.length=q.length-k;
}//2.2.4
void del_s_t(sqlist &q,elemtype s,elemtype t){
int k=0;
if(s>=t||q.length==0) printf("false");
for(int i=0;i<q.length;i++){
if(q.data[i]<=s||q.data[i]>=t){
q.data[k]=q.data[i];
k++;
}
}
q.length=k;
}//2.2.5
void del_s_t_1(sqlist &q,elemtype s,elemtype t){
int k=0;
if(s>=t||q.length==0) printf("false");
for(int i=0;i<q.length;i++){
if(q.data[i]<s||q.data[i]>t){
q.data[k]=q.data[i];
k++;
}
}
q.length=k;
}//2.2.6
void del_rep(sqlist &q){int k=1;
if(q.length==0)
printf("有序表为空");
for(int i=1;i<q.length;i++){
if(q.data[i]!=q.data[i-1]){
q.data[k]=q.data[i];
k++;
}
}
q.length=k;
}//2.2.7
sqlist Merge(sqlist &q,sqlist &p){
sqlist o;
o.length=q.length+p.length;
if(o.length==0) return o;
int i=0,j=0,k=0;while(i<q.length&&j<p.length){
if(q.data[i]<=p.data[j])
o.data[k++]=q.data[i++];
else
o.data[k++]=p.data[j++];
}
while(i<q.length){ //还有一个数组有剩余
o.data[k++]=q.data[i++];
}
while(i<p.length){
o.data[k++]=p.data[j++];
}
for(int m = 0 ;m < o.length; m++){
printf("%d ",o.data[m]);
}
return o;
}//2.2.8
void Reverse1(sqlist &q,int l,int r){
if(l>=r||r>=maxsize) return;
int i,j;
elemtype temp;
//寻一中点,两边对应互换
int m=(r+l)/2;
for(i=0;i<m-l;i++){
temp=q.data[l+i];
q.data[l+i]=q.data[r-i];
q.data[r-i]=temp;
}
}
void exchange(sqlist &q,int m,int n){ //前m个和后n个
//整个顺序表逆序,然后分别逆序前面和后面两部分
Reverse1(q,0,m+n-1); //整个翻转
Reverse1(q,0,n-1); //后n个变为前n个,对其翻转
Reverse1(q,n,m+n-1);
}//2.2.9 要求最快查找下,则用二分法
void Search_x(sqlist &q,elemtype x){
int low=0,high=q.length-1;
int mid,temp,i;while(low<=high){
mid=(low+high)/2;
if(x==q.data[mid]) break;
else if(x>q.data[mid])
low=mid+1;
else high=mid-1;
}
//找到x且不是最后一个
if(q.data[mid]==x&&mid!=q.length-1){
temp=q.data[mid];
q.data[mid]=q.data[mid+1];
q.data[mid+1]=temp;
}
//没找到,因为序列递增有序,则插入
if(low>high){
for(i=q.length-1;i>high;i--)
q.data[i+1]=q.data[i]; //后移
q.data[i+1]=x; //插入x
q.length++;}
return ;
}//2.2.10 基本类似第八题,两部分翻转,整个翻转
void Converse(sqlist &q,int p,int n){
Reverse1(q,0,p-1);
Reverse1(q,p,n-1);
Reverse1(q,0,n-1);
}
/*3个Reverse1函数的时间复杂度分别为O(p/2)、O((n-p)/2)、
O(n/2),所以时间复杂度为O(n/2)。空间复杂度为O(1)。
*///2.2.11 两个等长序列
int M_search(sqlist &q,sqlist &p){
int f1=0,f2=0,e1=q.length-1,e2=p.length-1,mid1,mid2;
while(f1!=e1||f2!=e2){
mid1=(f1+e1)/2;
mid2=(f2+e2)/2;if(q.data[mid1]==p.data[mid2])
return q.data[mid1];if(q.data[mid1]<p.data[mid2]){ //舍去q较小和p较大
if((f1+e1)%2==0){ //元素个数为奇数
f1=mid1;
e2=mid2;
}
else { //偶数
f1=mid1+1;
e2=mid2;
}
}
else{ //舍去q较大和p较小
if((f2+e2)%2==0){
e1=mid1;
f2=mid2;
}
else{
e1=mid1;
f2=mid2+1;
}
}
}return q.data[f1]<p.data[f2]?q.data[f1]:p.data[f2];
}//时间复杂度类似二分,O(log2n),空间复杂度:O(1)
//2.2.12
int Majority(sqlist &q){
int x=q.data[0],count=1,i;
for(i=1;i<q.length;i++)
{
if(q.data[i]==x)
count++;
else
{
if(count>0)
count--;
else
x=q.data[i];
count=1;
}
}
if(count>0){ //计数
for(i=count=0;i<q.length;i++){
if(q.data[i]==x)
count++;
}
}
if(count>q.length/2) return x;
else return -1;
}//时间复杂度O(n),空间复杂度O(1)//2.2.13
/*
空间换时间,标记数组a对应1~n的正整数,数组a与给定序列比较,
序列中出现小于0或者大于长度的数,1~n中出现空缺,第一个未被
标记的数即所求正整数。
*/
int FindMin(sqlist &q){
int i,x;
int a[q.length];
for(i=0;i<q.length;i++){
a[i]=0;
}
for(i=0;i<q.length;i++){
if(q.data[i]>0&&q.data[i]<q.length)
a[q.data[i]-1]++;
}
for(i=0;i<q.length;i++){
if(a[i]==0) break;
}
return i+1;
}//时间O(n),额外分配了一个a[n],空间O(n)int main()
{
sqlist q={{0,1,1,2,3,4,5,6,7,8,9},11};
sqlist o={{5,6,7,8},4};
sqlist p={{1,2,3,4},4};
sqlist a={{2,1,2,1,2},5};elemtype e=0;
for(int i = 0 ;i < q.length; i++)
{
printf("%d ",q.data[i]);
}printf("\n");
/*del_Min(q,e);
printf("%d",e);*///Reverse(q);
//del_x(q,3);
//del_s_t(q,1,3);
//del_s_t_1(q,1,3);
//del_rep(q);
//Merge(q,p);
//exchange(q,5,6);
//Search_x(p,2);
//Search_x(p,4);//Converse(q,3,11);
//printf("%d",M_search(o,p));
//printf("%d",Majority(a));
printf("%d",FindMin(q));
printf("\n");
for(int i = 0 ;i < q.length; i++)
{
//printf("%d",i);
printf("%d ",q.data[i]);
}
}
2019考王道数据结构顺序表习题
猜你喜欢
转载自blog.csdn.net/ziyou434/article/details/100101309
今日推荐
周排行