在C中基于另一个对数组进行排序

时间:2017-04-23 13:32:11

标签: c arrays sorting

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

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

以b排序的值是

中每个整数的实数值

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

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;
        }
    }
}

它给了我输出:a = {2,3,1,0,0,0,6};             和b = {2,2,1,0,0,0,0};

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

2 个答案:

答案 0 :(得分:0)

将代码的主要部分逐字记录并将其转换为MCVE(Minimal, Complete, Verifiable Example),我得到代码:

#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 };

输出看起来像你想要的。因此,问题似乎不在您发布的代码中,而是在您未发布的代码中。目前尚不清楚这种麻烦可能采取什么形式。

答案 1 :(得分:-1)

您所说的是您希望排序稳定。这意味着原始数组中相等的项将在最终排序的数组中保持相同的顺序。

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

b[j] <= b[k]

这不是一个稳定的排序,并会重新排序彼此相等的条目。我能够得到错误的&#34;您通过进行此更改来描述的输出,但您在此处发布的代码:

b[j] < b[k]

稳定并产生您想要的输出。