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

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

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

输入描述:
一个数组

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

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

#include 
/* 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;
}

你可能感兴趣的:(c语言,c语言,算法,数据结构)