2014-11-02 45 views
-2

使用示例來自:how to sort 3 arrays together in C同時排序2陣列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  

以下是我的代碼。有誰知道如何修復代碼,以便按照字母順序對arr1進行排序,如果arr2有重複的話。

#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 
+2

實際上重複;但是,如果您打算修復此代碼,請檢查'arr2 [j-1]> arr2 [j' - 添加它們相等時應發生的事情。 – usr2564301 2014-11-02 14:30:43

+0

@ 2501我用這個例子來問這個問題 – user3035890 2014-11-02 14:47:00

+0

@Jongware,Zaphod有一個函數,他用來排列數組在一起,這很好,所以我想知道是否有人可以添加到這個併爲此場景排序 - -----------我試着說arr2 [j-1] == arr2 [j]然後qsort(arr1,i,10,cmp)。這不起作用,但我應該使用qsort? – user3035890 2014-11-02 14:59:00

回答

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; 
}