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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章