C - 排序整数的二维数组

时间:2017-01-18 21:12:59

标签: c arrays sorting

我有一个二维数组,其中第一行是id,第二行是多次出现。我想按出现次数对数组进行排序(id与数字一起移动) 我有以下代码(最小可行示例):

#include <stdio.h>
#include <stdlib.h>

int main(){
    int colors[64][2];
    int r;int a;int b;int i;
    for (i = 0; i < 63; ++i){
        r=rand()%40;
        colors[i][0]=i;
        colors[i][1]=r;
    }
    for (i = 0; i < 62; ++i){
        printf("%d : ", colors[i][0]);
        printf("%d\n", colors[i][1]);
    }
    printf("--------------------------------------------------------------\n");
    //sort colors now
    r=1;
    while(r==1){
        for (i = 0; i < 63; ++i){
            r=0;
            if (colors[i][1] < colors[i+1][1]){
                a = colors[i][0];
                b = colors[i][1];
                colors[i][0] = colors[i+1][0];
                colors[i][1] = colors[i+1][1];
                colors[i+1][0] = a;
                colors[i+1][1] = b;
                r=1;
            }
        }
    }
    for (i = 0; i < 62; ++i){
        printf("%d : ", colors[i][0]);
        printf("%d\n", colors[i][1]);
    }
}

但是,除了id = 1值已经在9到10之间移动之外,输出无论如何都没有排序。 当前输出:

0 : 23
2 : 17
3 : 35
4 : 33
5 : 15
6 : 26
7 : 12
8 : 9
9 : 21
1 : 6
11 : 27
12 : 10
13 : 19
14 : 3
15 : 6
16 : 20
17 : 26
18 : 12
19 : 16
20 : 11
21 : 8
22 : 7
23 : 29
24 : 22
25 : 10
26 : 22
27 : 3
28 : 27
29 : 15
30 : 9
10 : 2
32 : 22
33 : 18
34 : 29
35 : 7
36 : 33
37 : 16
38 : 11
31 : 2
40 : 29
41 : 13
42 : 21
43 : 39
44 : 24
45 : 17
46 : 38
47 : 4
48 : 35
49 : 10
50 : 13
51 : 6
52 : 11
53 : 20
54 : 36
55 : 33
56 : 22
57 : 10
58 : 36
39 : 2
60 : 25
61 : 5
62 : 4

非常感谢所有帮助,谢谢

3 个答案:

答案 0 :(得分:1)

<强>程序

#include <stdlib.h>                                                                                                                                                                                                                                                          
#include <stdio.h>                                                                                                                                                                                                                                                           

#define ARRAY_SIZE(_a_) (sizeof(_a_) / sizeof(_a_[0]))                                                                                                                                                                                                                       

struct ColorPrevalence                                                                                                                                                                                                                                                       
{                                                                                                                                                                                                                                                                            
    unsigned int color_id;                                                                                                                                                                                                                                                   
    unsigned int count;                                                                                                                                                                                                                                                      
} sample_data[] =                                                                                                                                                                                                                                                            
{                                                                                                                                                                                                                                                                            
    {10, 3},                                                                                                                                                                                                                                                                 
    {4, 17},                                                                                                                                                                                                                                                                 
    {19, 6},                                                                                                                                                                                                                                                                 
    {7, 3},                                                                                                                                                                                                                                                                  
    {3, 0},                                                                                                                                                                                                                                                                  
    {2, 1},                                                                                                                                                                                                                                                                  
};                                                                                                                                                                                                                                                                           

void print_data(void)                                                                                                                                                                                                                                                        
{                                                                                                                                                                                                                                                                            
    for (size_t i = 0; i < ARRAY_SIZE(sample_data); i++)                                                                                                                                                                                                                     
    {                                                                                                                                                                                                                                                                        
        printf(                                                                                                                                                                                                                                                              
            "{color: %u, count: %u}\n",                                                                                                                                                                                                                                      
            sample_data[i].color_id,                                                                                                                                                                                                                                         
            sample_data[i].count);                                                                                                                                                                                                                                           
    }                                                                                                                                                                                                                                                                        
}                                                                                                                                                                                                                                                                            

int compare_ColorPrevalence(const void *v1, const void *v2)                                                                                                                                                                                                                  
{                                                                                                                                                                                                                                                                            
    const struct ColorPrevalence *c1 = v1;                                                                                                                                                                                                                                   
    const struct ColorPrevalence *c2 = v2;                                                                                                                                                                                                                                   
    return c1->count - c2->count;                                                                                                                                                                                                                                            
}                                                                                                                                                                                                                                                                            

int main(int argc, char **argv)                                                                                                                                                                                                                                              
{                                                                                                                                                                                                                                                                            
    puts("Before Sorting:");                                                                                                                                                                                                                                                 
    print_data();                                                                                                                                                                                                                                                            
    qsort(                                                                                                                                                                                                                                                                   
        sample_data,                                                                                                                                                                                                                                                         
        ARRAY_SIZE(sample_data),                                                                                                                                                                                                                                             
        sizeof(struct ColorPrevalence),                                                                                                                                                                                                                                      
        compare_ColorPrevalence);                                                                                                                                                                                                                                            
    puts("After Sorting:");                                                                                                                                                                                                                                                  
    print_data();                                                                                                                                                                                                                                                            
}                        

<强>输出

$ ./qsort 
Before Sorting:
{color: 10, count: 3}
{color: 4, count: 17}
{color: 19, count: 6}
{color: 7, count: 3}
{color: 3, count: 0}
{color: 2, count: 1}
After Sorting:
{color: 3, count: 0}
{color: 2, count: 1}
{color: 10, count: 3}
{color: 7, count: 3}
{color: 19, count: 6}
{color: 4, count: 17}

答案 1 :(得分:0)

使用您的示例代码,任务可以这样完成:

#include <stdio.h>
#include <stdlib.h>

int main(){
   int colors[64][2];
   int r; int a; int b; int i;
   for (i = 0; i < 64; ++i){
      r = rand() % 40;
      colors[i][0] = i;
      colors[i][1] = r;
   }
   for (i = 0; i < 64; ++i){
      printf("%d : ", colors[i][0]);
      printf("%d\n", colors[i][1]);
   }
   printf("--------------------------------------------------------------\n");

   //sort colors now
   for (i = 0; i < 64; ++i) {
      for (int j = i + 1; j < 64; ++j) {
         if (colors[j][1] < colors[i][1]) {
            a = colors[i][0];
            b = colors[i][1];
            colors[i][0] = colors[j][0];
            colors[i][1] = colors[j][1];
            colors[j][0] = a;
            colors[j][1] = b;
         }
      }
   }

   for (i = 0; i < 64; ++i){
      printf("%d : ", colors[i][0]);
      printf("%d\n", colors[i][1]);
   }

}

答案 2 :(得分:0)

您可以尝试这样的事情:

#include <stdio.h>
#include <stdlib.h>

#define ROWS 64
#define COLS 2

enum {ID, COUNT};

int cmp_func(const void *a, const void *b) {
    const int *num1 = (const int *)a;
    const int *num2 = (const int *)b;

    if (num1[COUNT] > num2[COUNT]) {
        return +1;
    } else if (num1[COUNT] < num2[COUNT]) {
        return -1;
    }

    return 0;
}

void print_array(int colors[][COLS], size_t nrows) {
    size_t row;

    for (row = 0; row < nrows; row++) {
        printf("%d %d\n", colors[row][ID], colors[row][COUNT]);
    }
}

void add_numbers(int colors[][COLS], size_t nrows) {
    size_t row;

    for (row = 0; row < nrows; row++) {
        colors[row][ID] = row;
        colors[row][COUNT] = rand()%40;
    }
}

int main(void) {
    int colors[ROWS][COLS];

    add_numbers(colors, ROWS);

    printf("\nBefore:\n");
    print_array(colors, ROWS);

    qsort(colors, ROWS, sizeof(*colors), cmp_func);

    printf("\nAfter:\n");
    print_array(colors, ROWS);

    return 0;
}