我有一个列表int [size]和一个列表maxA [size]应该包含按A值排序的A [size]索引。基本上A [maxA [0]]应该是A中最大的int,而maxA [0]是其索引。
这是我的比较功能:
int compareA(const void *a,const void *b){
return A[*(TYPE *)b] - A[*(TYPE *)a];
}
我用
来称呼它qsort(maxA,SIZE_L,sizeof(int),compareA);
我有一个循环,通过随机的正数来增加元素的值,并且当A [i]> L(L由结尾列表定义,它是随机的)然后:
A[maxA[i]] = INT_MIN;
然后停止增加它 一段时间后它停止工作。这是我的输出:
INDEX VALUE
1 320
2 207
8 -437
3 -681
4 -960
6 -1638
5 -2928
9 -7395
7 -19272
0 -2147483648
Removed: 1
6 -1560 500
5 -2684 1000
9 -7140 1066
7 -18396 1168
1 -2147483648
0 -2147483648
2 276
3 0
8 -418
4 -864
为什么我会得到这种随机行为;
答案 0 :(得分:1)
你要做的事情或多或少是不可能的,除非你做一些丑陋的黑客行为。 qsort
根本不支持这一点。
我写了一个自定义排序功能。选择排序算法并在Web上搜索一些代码。冒泡排序,选择排序和插入排序相当容易实现。如果您希望在一般情况下获得更高的性能,可以查看快速排序,合并排序或堆排序。但是,如果您只想将它用于整数数组,那么您可以查看存储桶排序。您所做的是对您找到的代码的简单修改。
例如,改变:
void sort(int * arr, size_t size)
{
...
if([i]<arr[i+1]) {
swap(arr[i], arr[i+1])
}
...
}
到
void sort(int * arr, size_t size, int * arr2, size_t size2)
{
...
if(arr[i]<arr[i+1]) {
swap(arr[i], arr[i+1])
swap(arr2[i], arr2[i+1])
}
...
}
只需在参数列表中添加第二个数组和大小,然后在两个数组上执行相同的更改。
正如Jonathan Leffler所指出的,要小心你如何使用list
和array
这两个词。列表通常是链表。它们排序有点棘手,但是如果你想要的话,也可以很容易找到代码示例。由于您尝试使用qsort
解决此问题,我假设您正在讨论数组。
如果你想使用现有的qsort
,我认为最好的方法是首先创建一个结构数组。像这样:
typedef struct {
int A;
int maxA;
} comboElement;
...
comboElement mergedList[size];
for(int i=0; i<size; i++) {
mergedList[i].A = A[i];
mergedList[i].maxA = maxA[i];
}
qsort(mergedList, size, sizeof(mergedList[0]),compareMergedList);
当然,您必须重写比较功能。不在此处:当您重新调用qsort
时,请勿使用sizeof <type>
。请改用sizeof <first element in list>
。原因是如果您将来更改类型,您可能会忘记更改所有实例。