数据结构--线性表的顺序表示(6~10)

6 . 从有序表中删除所有其值重复的元素,使表中所有元素均不同。
算法思想:相同元素一定在连续的位置上,所以如果不同则插入到前面所有非重复的有序表的最后。

void Del_All__Du(SqList &L)//Delete all Duplicate
{
    int temp = L.data[0], count = 0;
    for (int i = 1; i < L.length; i++)//{ 1, 1, 2, 3, 4, 4, 5, 6, 6 }
    {
        if (L.data[i] == temp)
        {
            count++;
        }
        else
        {
            temp = L.data[i];
        }
        L.data[i - count] = L.data[i];
    }
    L.length -= count;
}

7 . 将两个有序表合并成一个新的有序线性表,并由函数返回结果顺序表。
算法思想:按顺序不断取下两个顺序表头较小的节点存入新的顺序表,然后剩下的加到新表的后面。

void Merge(SqList A,SqList B,SqList &C)
{                                       
    int count = 0;
    int i = 0, j = 0;
    while (i < A.length&&j < B.length)
    {
        if (A.data[i] <= B.data[j])
        {
            C.data[count++] = A.data[i++];
        }
        else
        {
            C.data[count++] = B.data[j++];
        }
    }
    while (i < A.length)
    {
        C.data[count++] = A.data[i++];
    }
    while (j < B.length)
    {
        C.data[count++] = B.data[j++];
    }
    C.length = count;
}

8 . 已知在一维数组A[m+n]中依次存放着两个线性表(a1,a2,a3,…,am)和(b1,b2,b3,…,bn),试编写一个函数,将数组中两个顺序表互换,即将(b1,b2,b3,…,bn)放在(a1,a2,a3,…,am)的前面。
算法思想:将两个线性表分别转置,再将A转置。

void Reverse(SqList &A,int a,int b)
{                                       
    int mid = (a + b + 1) / 2;
    for (int i = 0; i < mid-a; i++)
    {
        int temp = A.data[b - i];
        A.data[b - i] = A.data[a + i];
        A.data[a + i] = temp;
    }
}

9 . 线性表(a1,a2,a3,…,an)中元素递增有序,且按顺序存储于计算机内。要求设计一算法完成用最少时间在表中查找数据值为x的元素;若找到,将其与后继元素位置交换;若找不到将其插入到表中,使表中的元素仍递增有序。
算法思想:折半查找

bool SearchExchangeInsert(SqList &A,int x)
{                                       
    int low = 0, high = A.length - 1, i;
    int mid = (low + high) / 2;
    int temp = 0;
    while (low < high)
    {
        if (A.data[mid] == x&&mid != A.length - 1)
        {
            temp = A.data[mid];
            A.data[mid] = A.data[mid + 1];
            A.data[mid + 1] = temp; 
            return true;
        }
        else if (A.data[mid] >= x)
        {
            high = mid - 1;
            mid = (low + high) / 2;
        }
        else
        {
            low = mid + 1;
            mid = (low + high) / 2;
        }
    }
    for (i = A.length - 1; i > high; i--)
        {
            A.data[i + 1] = A.data[i];
        }
        A.data[i + 1] = x;
        A.length++;

        return true;
}

10 .一个长度为L(L ≥1) 的升序序列S,处在第 L/2 个位置的数称为S的中位数。例如,若序列S1=(11,13,15,17,19),则S1的中位数是15;
两个序列的中位数是含它们所有元素所组成的升序序列的中位数。例如,若S2=(2,4,6,8,20),则S1和S2的中位数是11。
现在有两个等长升序序列A和B,试设计一个在时间和空间都尽可能高效的算法,找出两个序列A和B的中位数。
算法思想:如果S1[L/2]大于S2[L/2],则在S1[L/2]前半截中再找中位数,S2[L/2]后半截找中位数。etc.

int FindMid(int A[], int B[])
{
    int s1=0,d1=MaxSize-1,m1;
    int s2=0,d2=MaxSize-1,m2;

    while(s1!=d1||s2!=d2){
        m1=(s1+d1)/2;
        m2=(s2+d2)/2;

        if(A[m1]<B[m2]){
            if((s1+d1)%2==0){
                s1=m1;
                d2=m2;
            }else{
                s1=m1+1;
                d2=m2;
            }
        }else if(A[m1]>B[2]){
            if((s2+d2)%2==0){
                d1=m1;
                s2=m2;
            }else{
                d1=m1;
                s2=m2+1;
            }
        }else{
            return A[m1];
        }
    }
    return A[s1]<B[s2]?A[s1]:B[s2];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值