在C中,如何对每个指针指向int的可变长度数组的指针数组进行排序?

我的问题是如何通过所有其他数组中的第一个数字对arr6进行排序。 我的意思是,如果arr1在第一个num有3个,那意味着它需要在arr6为3。 最后, arr6需要首先指向arr4arr4arr2arr1arr5

 #include  #include  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][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"); } } 

正如评论中所指出的,主要答案是“谨慎”。 问题本身没有说明排序数组的内容。 但是,其中一条评论中提到了这一点。 这是完成工作的代码,使用标准库函数qsort() – 两次。 我稍微扩展了数组列表,并将arr6arr6list以将其与其他arrN数组分开(并且可能有一个比list更好的名称 – 是我的guest)。

我叫这个qs79.c

 /* SO 4335-0957 */ #include  #include  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 

这就是添加了几乎相同内容的额外条目的原因。