(c语言版)数组去重和排序 题目描述: 给定一个乱序的数组,删除所有的重复元素,使得每个元素只出现一次,并且按照出现的次数从高到低

本文介绍了如何使用C语言实现数组去重并按出现次数排序,首先通过统计每个数字的出现次数,然后根据次数对数组进行排序,提供了一个使用计数排序的解决方案和一个暴力去重的辅助方法。
摘要由CSDN通过智能技术生成

【编程题目 | 100分】数组去重和排序 [ 100 / 中等 ]

数组去重和排序
题目描述:
给定一个乱序的数组,删除所有的重复元素,使得每个元素只出现一次,并且按照出现的次数从高到低进行排序,相同出现次数按照第一次出现顺序进行先后排序。

输入描述:
一个数组

输出描述:
去重排序后的数组

示例 1:
输入
1,3,3,3,2,4,4,4,5
输出
3,4,1,2,5

#include <stdio.h>
/* 1,先统计每个数字出现的次数*/
/* 2,根据每个数字出现的次数来排序*/
/* 3,输出 */

struct t_data{
    int num; //某个数,
    int times; //这个数字出现了几次。
};
int statis(int a[],int nums,struct t_data mydata[]) {
    int data_types = 0; // 分类后
    int i = 0;
    int j = 0;
    for(i = 0;i<nums;i++){
        for(j = 0;j< data_types;j++){
            if(a[i] == mydata[j].num){ //在结构体数组中找到了这个数,个数加1
                mydata[j].times++;
                break;
            }
        }
        if(j == data_types){ //没找到,增加一项 。
            mydata[data_types].num = a[i];
            mydata[data_types].times = 1;
            data_types ++;
        }
    }
    return data_types;
}
void myorder(struct t_data mydata[],int data_types){
    for(int i = 1;i<data_types;i++){
        for(int j = 0;j<data_types-i;j++){
            if(mydata[j].times < mydata[j+1].times){
                struct t_data t  = {0};
                t = mydata[j];
                mydata[j] = mydata[j+1];
                mydata[j+1] = t;
            }
        }
    }
}
void output(struct t_data mydata[],int data_types) {
    for(int i = 0 ;i<data_types;i++){
        printf("%d ",mydata[i].num);
    }
}
int main(){
    int a[] = {1,9,3,4,5,5,6,6,6,6,7,8};
    int nums = sizeof(a)/sizeof(a[0]);
    struct t_data mydata[100] = {0};
    /*返回的就是类型数,每个类型又多少数字就放到mydata机构体数组中*/
    int data_types = statis(a,nums,mydata);
    myorder(mydata,data_types);
    output(mydata,data_types);
    return 0;
}

万能去重暴力解法:

int delete_repeat(int a[],int n){
    int after_nums = 0;
    int i = 0;
    int j = 0;
    for(i = 0;i<n;i++){
        for(j = 0;j<after_nums;j++){
            if(a[j] == a[i]){
                break;
            }
        }
        if( j == after_nums){
            a[after_nums] = a[i];
            after_nums++;
        }
    }
    return after_nums;
}
int main(){
    int a[] = {1,3,3,3,3,2,5,3,2,5};
    int n = sizeof(a)/sizeof(a[0]);
    n = delete_repeat(a,n);
    for(int i = 0;i<n;i++){
        printf("%d ",a[i]);
    }
    return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值