2019考王道数据结构顺序表习题

//个人粗糙整理,由于不断调试,代码略显粗糙,请见谅。

#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]);
    }
}

发布了16 篇原创文章 · 获赞 12 · 访问量 8090

猜你喜欢

转载自blog.csdn.net/ziyou434/article/details/100101309
今日推荐