我有一个二维数组,其中第一行是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
非常感谢所有帮助,谢谢
答案 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;
}