Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何根据另一个数组的数字顺序对数组进行排序?_C_Sorting_Qsort - Fatal编程技术网

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

C 如何根据另一个数组的数字顺序对数组进行排序?,c,sorting,qsort,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'} 我知道可以使用q

编辑:这都是用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的索引变化吗?是否有内置函数或我必须自己实现


感谢

qsort
允许您指定自己的比较函数,以指定数组的排序标准。它允许您对任何类型的数组进行排序(可以是
int
,也可以是
struct
),只要您知道要排序的对象的大小。最好是创建一个
结构对{int numValue;char charValue}
来表示该对。你可以

  • 编写一个函数来接受
    numFields
    charFields
    ,并返回
    对的数组
  • 编写一个比较函数,供参考。其他的
  • 对成对数组和比较函数调用
    qsort
  • 编写一个函数,将
    的数组转换回
    字符域

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

    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;
                }
            }
        }
    
    int-temp;
    字符a;
    
    对于(i=0;i只需声明一个结构数组,其中每个元素都包含数字及其对应的字母。然后根据数字对数组进行排序

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

    \include
    
    #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;
    }
    
    #包括 int numFields[]={5,1,3,2,7}; char charFields[]={'a','b','c','d','e'}; //排序结果的临时数组 国际货币基金组织2[5]; int charFields2[5]; //排序索引 int idx[]={0,1,2,3,4}; //cmompare函数使用索引值比较numFields 整数比较(常数无效*a,常数无效*b){ 返回numFields[*(int*)a]-numFields[*(int*)b]; } 内部主(空){ //使用comapare函数对索引值进行排序 qsort(idx,5,sizeof(int),compar); //使用排序索引以新的排序顺序复制值 int i;
    对于(i=0;i@MarounMaroun什么,然后用Java重新编写整个C项目?不是直接-您需要对索引进行排序,然后使用该索引对原始数组重新排序。使用比较器中的numFields数组将索引数组从0排序到n-1,然后根据索引对字符字段重新排序。快速排序算法非常简单显然,C标准库的实现版本不允许您跟踪更改的索引,因此,我建议您实现自己的排序算法来处理它。一种方法是编写自己的实现。它只比较
    numFields
    ,但同时交换
    numFields
    char字段
    项。另一个是将数据重建到结构数组
    {int num;char ch;}
    ,然后只比较结构的
    num
    字段。Thera更多…为什么不?使用这个他可以自己实现。-1:冒泡排序效率很低-上面的代码也有缺陷。是的,这就是我指定的原因。我知道冒泡排序不合适。他想要自己的实现代码,这就是我给出这种类型答案的原因。我没有拒绝vote、 但是,除非您真的需要,否则重新实现排序算法是一个非常糟糕的主意。即使在最简单的实现中,也很容易引入错误。