有序顺序表和无序顺序表 删除重复值算法时间复杂度为O(n)

这里的seqlistD L是顺序表

int theMaxNum(seqlistD L){
    int max=0;
    int i;
    if (L->length==0)
    {
        printf("NULL!!!!!!!!!!\n");
        return 0;
        /* code */
    } 
    for(i=0;i<L->length;i++){
        if(L->data[i]>max){
            max=L->data[i];
        }
    }
    return max;
}

// 删除有序序列中的重复元素
// 这个算法相当于是两个指针,A指针不动,B指针向后移动,当B指针指到的数据与A中不一样时A指针才会向后移动,并给填充B指针指到的数据
void delete_sortedList_repeat(seqlistD L){
    if (L->length==0)
    {
        printf("顺序表为空!\n");
        return;
    }
    int i,j;
    for(i=0,j=1;j<L->length;j++){
        if (L->data[i]!=L->data[j])
        {
            i++;
            L->data[i]=L->data[j];   //这个算法前提是有序序列,若是无序序列则不可以
        }  
    }
    L->length=i+1;//因为i是从0开始算的,L的长度是从1开始算的,所以L.length=i+1;
}
// 无序的顺序表,用散列表来实现删除重复值并排序算法,此时的时间复杂度为n
void delete_unsortedList_repeat(seqlistD L){
    if (L->length==0)
    {
        /* code */
        printf("NULL!!!!!!!!!\n");
        return;
    }
    int max=theMaxNum(L);
    // int cnt[max+1]={0};     []中不能是变量
    int *cnt=(int *)malloc(sizeof(int)*(max+1));
    for (int i = 0; i < max; i++)
    {
        cnt[i]=0; //弄个全是0,长度为顺序表最大值的散列表,作为每个元素个数的记录
    }
    for (int i = 0; i < L->length; i++)
    {
        cnt[L->data[i]]++;  //相同编号的的萝卜跳相同编号的坑,但是坑的编号不会有相同的。
    }
    // 遍历cnt取其中元素非零的编号
    for (int i = 0,j=0; i < max; i++)
    {
        /* code */
        if (cnt[i]!=0)
        {
            L->data[j]=i;
            j++;
            /* code */
        }
        L->length=j;
    }   
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值