如何根据另一个数组的数字顺序对数组进行排序?

时间:2014-03-31 12:45:17

标签: c sorting qsort

编辑:这一切都是在C中完成的。

假设我有以下两个数组:

int numFields[] = {5, 1, 3, 2, 7}
char charFields[] = {'a' , 'b', 'c', 'd', 'e'}

我想以数字方式对numFields进行排序,并使charFields采用匹配numFields的新顺序,以便:

int numFields[] = {1, 2, 3, 5, 7}
char charFields[] = {'b', 'd', 'c', 'a', 'e'}

我知道可以使用qsort以数字方式对numFields进行排序,但是可以对charFields进行排序以匹配numFields的索引更改吗?有内置功能还是我必须自己实现?

由于

4 个答案:

答案 0 :(得分:3)

qsort允许您指定自己的比较函数,以指定数组应排序的条件。它允许您对任何类型的数组进行排序(可以是int,可以是struct),只要您知道要排序的对象的大小即可。您最好的选择是创建struct pair { int numValue; char charValue }来表示该对。你可以

  1. 编写一个函数来接受numFieldscharFields并返回pair数组。
  2. 编写比较函数using this question and answers以供参考。其他code examples here
  3. 在您的数组对和您的比较函数
  4. 上调用qsort
  5. 编写一个函数将pair的数组转换回charFields

答案 1 :(得分:0)

简单地声明一个struct数组,每个元素都包含数字以及与之对应的字母。然后根据数字

对数组进行排序

或使用具有特定回叫功能的qsort来执行您需要的操作。

答案 2 :(得分:0)

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

int numFields[] = {5, 1, 3, 2, 7};
char charFields[] = {'a' , 'b', 'c', 'd', 'e'};
// temporary arrays for sorted result   
int numFields2[5];
int charFields2[5];
// an index for sorting
int idx[] = {0, 1, 2, 3, 4};
// A cmompare function compares the numFields using the index values
int compar(const void* a,const void* b){
     return numFields[*(int*)a]-numFields[*(int*)b];
}

int main(void) {
    // sort the index values using the comapare function
    qsort(idx, 5, sizeof(int), compar);
    // use the sorted index to copy the values in the new sort order
    int i;
    for(i=0;i<5;i++){
      numFields2[i] = numFields[idx[i]];
      charFields2[i] = charFields[idx[i]];
     }
     // Copy result to original arrays
     for(i=0;i<5;i++){
        numFields[i] = numFields2[i];
        charFields[i] = charFields2[i];
     }
    return 0;
}

答案 3 :(得分:-1)

在这里我尝试开发冒泡排序程序尝试使用它。,

int temp;
char a;
for(i=0;i<no;i++)
    {
        for(j=i;j<no;j++)
        {
            if(numFields[i] > numFields[j])
            {
                temp=numFields[i];
                numFields[i]=numFields[j];
                numFields[j]=temp;


                a=charFields[i];
                charFields[i]=charFields[j];
                charFields[j]=a;
            }
        }
    }