当前位置: 首页 > 知识库问答 >
问题:

在 C 中根据另一个数组对数组进行排序

戈念
2023-03-14

我有两个整数数组,我试图根据另一个数组对第一个数组进行排序。

例如。a = {1,2,3,6,0,0,0};和 b = {1,2,2,0,0,
0,0,0};

在 B 中排序的值是 A 中每个整数的实值

排序后我期望的预期结果是:

a = {2,3,1,6,0,0,0};
b = {2,2,1,0,0,0,0};

这是我用的代码

int j,k,temp1,temp2;
for (j=0; j<N; j++){
    for (k=j+1; k<N; k++){
        if (b[j] < b[k]){
            temp1 = b[j];
            b[j] = b[k];
            b[k] = temp1;
            temp2 = a[j];
            a[j] = a[k];
            a[k] = temp2;
        }
    }
}

它给出了我的输出:<code>a={2,3,1,0,0,6}和b={2,2,1,0,0,0}

我不知道错误在哪里,任何帮助和建议都值得赞赏。


共有2个答案

管峻
2023-03-14

你的意思是你希望这种类型是稳定的。这意味着原始数组中相等的项目将在最终排序数组中保持相同的顺序。

事实上,您在此处发布的代码确实是稳定的,并且会产生正确的输出。我怀疑您正在运行的真实代码正在使用以下比较:

b[j] <= b[k]

这不是一个稳定的排序,会对彼此相等的条目重新排序。通过进行这种更改,我能够得到您所描述的“错误”输出,但是您在这里发布的代码:

b[j] < b[k]

是稳定的,并产生你想要的输出。

能帅
2023-03-14

逐字记录代码的主要部分并将其转换为MCVE(最小、完整、可验证示例),我得到代码:

#include <stdio.h>

static void pr_data(const char *tag, int n, int *a)
{
    printf("%s = { ", tag);
    const char *pad = "";
    for (int i = 0; i < n; i++)
    {
        printf("%s %d", pad, a[i]);
        pad = ", ";
    }
    puts(" };");
}

int main(void)
{
    int a[] = { 1, 2, 3, 6, 0, 0, 0 };
    int b[] = { 1, 2, 2, 0, 0, 0, 0 };
    enum { N = sizeof(a) / sizeof(a[0]) };
    pr_data("a", N, a);
    pr_data("b", N, b);

    int j, k, temp1, temp2;
    for (j = 0; j < N; j++)
    {
        for (k = j + 1; k < N; k++)
        {
            if (b[j] < b[k])
            {
                temp1 = b[j];
                b[j] = b[k];
                b[k] = temp1;
                temp2 = a[j];
                a[j] = a[k];
                a[k] = temp2;
            }
        }
    }
    pr_data("a", N, a);
    pr_data("b", N, b);

    return 0;
}

请注意最基本的调试技术 — 打印操作前后的内容。这可确保您可以正确打印数据,拥有正确的数据,并使用已知有效的相同打印代码为您提供结果。

其输出为:

a = {  1,  2,  3,  6,  0,  0,  0 };
b = {  1,  2,  2,  0,  0,  0,  0 };
a = {  2,  3,  1,  6,  0,  0,  0 };
b = {  2,  2,  1,  0,  0,  0,  0 };

输出看起来像你想要的。因此,看起来问题不在于你发布的代码,而在于你没有发布的代码。尚不清楚这种麻烦会以何种形式出现。

 类似资料:
  • 问题内容: 是否可以对看起来像这样的数组进行排序和重新排列: 匹配此数组的安排: 不幸的是,我没有任何要跟踪的ID。我将需要优先处理items-array,以使其尽可能接近sortingArr。 更新: 这是我正在寻找的输出: 任何想法如何做到这一点? 问题答案: 就像是: 这是一个较短的代码,但是会破坏数组:

  • 问题内容: 我有多个数组,我想根据其中一个的排序顺序对所有数组进行排序,如下所示: 我希望函数执行后,数组将如下所示: 问题答案: 您可以执行以下操作:首先根据键控数组的索引的索引对它们进行索引的值对它们进行排序,然后使用: 如果要在任何类型的集合上使它通用(但仍以与std lib集合算法相同的样式返回数组): 以及带有自定义比较器的版本:

  • 我有多个数组,我想根据其中一个数组的排序顺序对所有数组进行排序,如下所示: 我预计函数执行后的数组将如下所示:

  • 因此,我试图学习如何为类项目排序数组。我想知道如何对一个数组进行排序,从而对另一个数组进行排序。在下面的代码中,我可以对年份数组进行排序,但我如何才能使更改这一数组将名称和艺术家数组都更改为它们排列的数组呢?此外,如果你有任何建议,让代码对眼睛不那么苛刻,请告诉我,我正在努力掌握这个概念。

  • 我试图根据一个数组的升序对多个数组进行排序。以下是示例: 现在,在按升序排列数组“a”之后,我想对其他数组进行排序。输出应如下所示: 按升序排列很好。但是,我无法对其他数组进行排序。我想创建一个函数,在我的主函数中使用它。很高兴听到一些建议。 我看过下面的帖子,但没有帮助我。 在C #中基于一个数组对另一个数组排序 以下是我尝试过的代码: 我可以知道我是否遗漏了什么或者做了什么完全错误的事情吗?