使用qsort对基于另一个列表的列表进行排序

时间:2017-10-26 07:39:41

标签: c sorting qsort

我有一个列表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 

为什么我会得到这种随机行为;

1 个答案:

答案 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所指出的,要小心你如何使用listarray这两个词。列表通常是链表。它们排序有点棘手,但是如果你想要的话,也可以很容易找到代码示例。由于您尝试使用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>。原因是如果您将来更改类型,您可能会忘记更改所有实例。