我的问题是如何按所有其他数组中的第一个数字排序arr6
。
我的意思是,如果arr1
在第一个num
中有3个,那意味着它必须在arr6
中为3。
最后,arr6
需要首先指向arr3
,arr4
,arr2
,arr1
,arr5
。
#include <stdio.h>
#include <stdlib.h>
void sort_arr(int **arr6);
void print_arr(int **arr6);
void order_arr(int **arr6);
int main(void)
{
int i = 1;
int arr1[] = { 3, 9, 6, 7 };
int arr2[] = { 2, 5, 5 };
int arr3[] = { 0 };
int arr4[] = { 1, 6 };
int arr5[] = { 4, 5, 6, 2, 1 };
int* arr6[] = { arr1, arr2, arr3, arr4, arr5 };
printf("Printing: \n");
print_arr(&arr6);
sort_arr(&arr6);
printf("Sorted rows\n");
print_arr(&arr6);
printf("Ordered array:\n");
order_arr(&arr6);
system("PAUSE");
return 0;
}
void sort_arr(int **arr6)
{
int c = 0, d = 0,k = 0, swap = 0;
for (k; k < sizeof(arr6)+1; k++)
{
for (c = 1; c < (arr6[k][0] + 1); c++)
{
for (d = 1; d < arr6[k][0]; d++)
{
if (arr6[k][d] > arr6[k][d + 1])
{
swap = arr6[k][d];
arr6[k][d] = arr6[k][d + 1];
arr6[k][d + 1] = swap;
}
}
}
}
}
void print_arr(int **arr6)
{
int c = 0, k = 0;
for (k = 0; k < sizeof(arr6) + 1; k++)
{
for (c = 1; c < (arr6[k][0] + 1); c++)
{
printf("%d ", arr6[k][c]);
}
printf("\n");
}
}
答案 0 :(得分:1)
正如评论中所述,主要答案是“谨慎”。问题本身并没有说明有关排序数组内容的任何内容。但是,其中一条评论中提到了这一点。这是使用标准库函数qsort()
完成工作的代码 - 两次。我稍微扩展了数组列表,并将arr6
重命名为list
以将其与其他arrN
数组分开(并且可能有一个比list
更好的名称 - 做我的客人。)
我打电话给qs79.c
:
/* SO 4335-0957 */
#include <stdio.h>
#include <stdlib.h>
void sort_arr(int num, int **list);
void print_arr(int num, int **list);
int main(void)
{
int arr1[] = { 3, 9, 6, 7 };
int arr2[] = { 2, 5, 5 };
int arr3[] = { 0 };
int arr4[] = { 1, 6 };
int arr5[] = { 4, 5, 6, 2, 1 };
int arr6[] = { 4, 2, 7, 1, 5 };
int arr7[] = { 4, 2, 5, 1, 6 };
int arr8[] = { 9, 12, 19, 18, 10, 28, 27, 15, 15, 27 };
int arr9[] = { 4, 2, 5, 1, 5 };
int *list[] = { arr1, arr2, arr3, arr4, arr5, arr6, arr7, arr8, arr9 };
enum { NUM_LIST = sizeof(list) / sizeof(list[0]) };
printf("Unsorted:\n");
print_arr(NUM_LIST, list);
sort_arr(NUM_LIST, list);
printf("Sorted:\n");
print_arr(NUM_LIST, list);
return 0;
}
static int cmpintasc(const void *v1, const void *v2)
{
int i1 = *(int *)v1;
int i2 = *(int *)v2;
return (i1 > i2) - (i1 < i2);
}
#if 0
static inline int min(int x, int y) { return (x < y) ? x : y; }
static int cmpintptrasc(const void *v1, const void *v2)
{
int *i1 = *(int **)v1;
int *i2 = *(int **)v2;
int max = min(i1[0], i2[0]) + 1;
for (int i = 1; i < max; i++)
{
if (i1[i] != i2[i])
return (i1[i] > i2[i]) - (i1[i] < i2[i]);
}
return (i1[0] > i2[0]) - (i1[0] < i2[0]);
}
#endif
static int cmpintptrasc(const void *v1, const void *v2)
{
int *i1 = *(int **)v1;
int *i2 = *(int **)v2;
return (i1[0] > i2[0]) - (i1[0] < i2[0]);
}
void sort_arr(int num, int **list)
{
/* Sort each array in turn */
for (int k = 0; k < num; k++)
qsort(&list[k][1], list[k][0], sizeof(list[k][0]), cmpintasc);
/* Sort the whole list */
qsort(list, num, sizeof(list[0]), cmpintptrasc);
}
void print_arr(int num, int **list)
{
for (int k = 0; k < num; k++)
{
printf("%d: [%d] ", k, list[k][0]);
for (int c = 1; c < (list[k][0] + 1); c++)
printf("%d ", list[k][c]);
printf("\n");
}
}
编译并运行时,它会产生:
Unsorted:
0: [3] 9 6 7
1: [2] 5 5
2: [0]
3: [1] 6
4: [4] 5 6 2 1
5: [4] 2 7 1 5
6: [4] 2 5 1 6
7: [9] 12 19 18 10 28 27 15 15 27
8: [4] 2 5 1 5
Sorted:
0: [0]
1: [1] 6
2: [2] 5 5
3: [3] 6 7 9
4: [4] 1 2 5 5
5: [4] 1 2 5 6
6: [4] 1 2 5 7
7: [4] 1 2 5 6
8: [9] 10 12 15 15 18 19 27 27 28
使用#if 0
... #endif
注释掉的版本进行了更为复杂的比较。它对数组进行排序,使得数组开头的数字最小的数据首先出现,然后对于那些具有公共子集的数组,较短的数组出现在较长的数组之前:
Unsorted:
0: [3] 9 6 7
1: [2] 5 5
2: [0]
3: [1] 6
4: [4] 5 6 2 1
5: [4] 2 7 1 5
6: [4] 2 5 1 6
7: [9] 12 19 18 10 28 27 15 15 27
8: [4] 2 5 1 5
Sorted:
0: [0]
1: [4] 1 2 5 5
2: [4] 1 2 5 6
3: [4] 1 2 5 6
4: [4] 1 2 5 7
5: [2] 5 5
6: [1] 6
7: [3] 6 7 9
8: [9] 10 12 15 15 18 19 27 27 28
这就是添加了几乎相同内容的额外条目的原因。