C 如何根据另一个数组的数字顺序对数组进行排序?
编辑:这都是用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
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、 但是,除非您真的需要,否则重新实现排序算法是一个非常糟糕的主意。即使在最简单的实现中,也很容易引入错误。