C语言 如何根据数组元素的重复次数对数组进行排序

o4tp2gmn  于 2022-12-03  发布在  其他
关注(0)|答案(2)|浏览(196)

比如我有一个数组{1,2,2,3,3,3,3,4,4,4,4,4,}我需要把它转换成{4,4,4,4,4,4,3,3,3,3,3,3,2,2,2,2,1}所以我必须用数组元素的重复次数来排序。我在C++上看到过一些解决这个问题的方法,但是我必须用C来写。我不能用vector或smth。仅使用缓冲区数组或精确数组内部进行排序。
我尝试过这样的事情,但老实说,现在我 eclipse 刻到一个死胡同:我脑子里有一个算法:
1.程序计算某个元素重复的次数并写入第二个数组
1.程序排序第二个数组
1.程序以某种方式对第一个数组和第二个数组进行排序

#include <stdio.h>

int main()
{
    const int size = 10;
    int A[size], B[size];
    int counter1, counter2 = -1;
    int temp = 0;
    
    for (int i = 0; i < size; i++) {
        printf("Enter %d element of array: ", i + 1);
        scanf_s("%d", &A[i]);
    }
    for (int i = 0; i < size-1; i++) {
        counter1 = 0;
        counter2++;
        for (int j = i; j < size; j++) {
            if (A[j] == A[j - 1]) {
                break;
            }
            if (A[j] == A[j+1]) {
                counter1++;
                B[counter2] = counter1;
                temp = A[i];
            }
        }
    }
    for (int i = 0; i < size; i++) {
        printf("El %d = %d\n",i+1,B[i]);
    }
}
gzjq41n4

gzjq41n41#

虽然不是最好的,但它确实完成了任务!我将最终结果存储在Result[len][2];变量中!您可以根据需要修改代码

#include <stdio.h>
#include <string.h>

int main( )
{  
    int array[] = {1,2,2,2,3,3,3,3,4,4,4,4,4,11,10,6,6,6,6,6,6,6,6,6,6,6,6,};
    int i,j,k=0,l,len,flag=0,temp0, temp1;
    len = sizeof(array)/sizeof(array[0]);
    int Result[len][2];
    memset(Result,0,sizeof(Result));

    for (i = 0 ;i < len ; i++ )
    {       
        if (k != 0)
        {
            for (l= 0 ;l < k ; l++ )
            if (array[i]== Result[l][0]) goto skip;    
        }
        for(j= i ; j < len ; j++ )                
        {  
            if (array[i] == array[j])
            {                
                Result[k][0] = array[j];  
                Result[k][1]++;flag = 1;
            }
        }   
        skip: if (flag == 1) {k++; flag = 0;}
    }

     for (i = 0; i < k; i++)
     {
         for(j= i+1 ; j < k ; j++ )        
         {
             if(Result[i][1] < Result[j][1])
               {   
                   temp0  = Result[i][0];
                   temp1  = Result[i][1]; 
                   Result[i][0] = Result[j][0];
                   Result[i][1] = Result[j][1];                   
                   Result[j][0]  = temp0 ;
                   Result[j][1]  = temp1 ;                   
               }
         }
     }

    for (i = 0; i < k; i++) printf("[%d][%d]\n",Result[i][0],Result[i][1]);     

    return 0;
}

在Linux环境下,我的计算机上的输出如下所示:

[6][12]
[4][5]
[3][4]
[2][3]
[11][1]
[10][1]
[1][1]
4ioopgfo

4ioopgfo2#

如何按重复次数对数组进行排序
1.依值排序大小为m的数组A
1.遍历数组并计算不同值的个数:n
1.分配struct s的大小为n的数组B[],该数组具有2个成员:价值和发生。
1.再次遍历数组A[]并填充B[]
1.依.occurrence排序B[]
1.遍历B[]并重新填充A[]
时间复杂度为O(m *log m)。

相关问题