【问题标题】:Sorting A list based on another list using qsort [closed]使用 qsort 根据另一个列表对列表进行排序 [关闭]
【发布时间】:2017-10-26 07:39:41
【问题描述】:

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

为什么我会出现这种随机行为;

【问题讨论】:

标签: c sorting qsort


【解决方案1】:

你想做的事情或多或少是不可能的,除非你做了一些丑陋的黑客行为。 qsort 根本不支持这个。

我会编写一个自定义排序函数。选择一种排序算法并在网上搜索一些代码。冒泡排序、选择排序和插入排序都很容易实现。如果您希望在一般情况下获得更高的性能,您可以查看快速排序、合并排序或堆排序。但是,如果您只想将其用于整数数组,则可以查看桶排序。然后你要做的就是对你找到的代码做一个简单的修改。

例如,改变:

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 &lt;type&gt;。请改用sizeof &lt;first element in list&gt;。原因是如果你以后更改类型,你可能会忘记更改所有实例。

【讨论】:

    猜你喜欢
    • 2018-11-15
    • 1970-01-01
    • 2023-04-01
    • 2021-05-02
    • 2011-03-22
    • 1970-01-01
    • 2010-10-21
    • 2013-09-17
    相关资源
    最近更新 更多