在C中同时排序2个数组

时间:2014-11-02 14:26:01

标签: c arrays string sorting multidimensional-array

使用以下示例:how to sort 3 arrays together in C

我有2个数组,我想要一起排序,例如1是字符A-Z,另一个是ID号:1,2,3 ......

char arr1 [3] [10] = {C,B,A}; int arr2 [3] = {2,1,2};

我在下面的代码从最低到最高的数字排序第二个数组,并相应地对第一个数组进行排序。

无序的数组:

Charlie            2         
Bravo              1          
Aplha              2   

Bravo              1           
Charlie            2          
Aplha              2

我的问题是,如果arr2中有重复项,我如何按字母顺序对arr1进行排序。您可以在下面看到Alpha和Charlie翻转,因为它们在arr2中有重复值,这就是我想要输出的样子。

Bravo              1           
Aplha              2           
Charlie            2       

以下是我的代码。有没有人知道如何修复代码,以便在arr2有重复的情况下按字母顺序对arr1进行排序。

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


int cmp(const void *a, const void *b) { 
    return strcmp(a, b); 
}

void sort(long sz, char arr1[][5], int arr2[])
{
long i;
long j;
char arr1temp[5];
int arr2temp;

for(i=1; i<sz; ++i) {
    j=i;
    while(j>0 && arr2[j-1] > arr2[j]) {
        arr2temp = arr2[j-1];
        arr2[j-1] = arr2[j];
        arr2[j] = arr2temp;

        strcpy(arr1temp, arr1[j-1]);
        strcpy(arr1[j-1], arr1[j]);
        strcpy(arr1[j], arr1temp);
        j = j-1;
        }
    }


}

int main()
{
    int i,j,count;

    char arr1[3][5] = {"C", "B", "A"};
    int arr2[3] = {2,1,2};
    printf("ordered list\n");
    for (i=0;i<3;i++)
        printf("%s\t%d\n",arr1[i],arr2[i]);
    printf("unordered list\n");
    sort(3, arr1, arr2);        
    for (i=0;i<3;i++)
        printf("%s\t%d\n",arr1[i],arr2[i]);
}

输出:

unordered list
C       2
B       1
A       2

ordered list
B       1
C       2
A       2

1 个答案:

答案 0 :(得分:0)

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

int int_compare(const void *elem1, const void *elem2)
{
    return (*(int *)elem1) - (*(int *)elem2);
}

int string_compare(const void *elem1, const void *elem2)
{
    return strcmp(((char*)elem1), ((char *)elem2));
}

int main(int argc, char **argv)
{
    char arr1[3][5] = {"C", "B", "A"};
        int arr2[9] = {2, 1, 2, 3, 5, 1, 0, 34, 5};

    qsort(arr2, (sizeof(arr2)/sizeof(arr2[0])), sizeof(arr2[0]), &int_compare);
    qsort(arr1, (sizeof(arr1)/sizeof(arr1[0])), sizeof(arr1[0]), &string_compare);  

    for (int i = 0; i < (sizeof(arr2)/ sizeof(arr2[0])); i++) {
        printf("%i\n", arr2[i]);
    } 
    printf("\n");
    for (int i = 0; i < (sizeof(arr1)/ sizeof(arr1[0])); i++) {
        printf("%s\n", arr1[i]);
    } 

    return 0;
}