泡泡排序的一个错误

时间:2013-10-03 09:02:26

标签: c sorting

我想对2 * n矩阵进行排序,在输入中给出n。制作程序以输出矩阵。这是要求:

  1. 第一列必须在ASC中排序,
  2. 尽可能在DESC中的第二列。
  3. 例如,设n = 5,矩阵为

    3 4
    1 2
    3 5
    1 6
    7 3
    

    结果应为

    1 6
    1 2
    3 5
    3 4
    7 3
    

    所以我写下这样的代码。第一行输入值n,以及如上所示的以下行。

    #include <stdio.h>
    #define TWO_16 65536
    #define TWO_15 32768
    
    int v[100000][2];
    int z[100000];
    int vec[100000];
    int n;
    
    
    int main()
    {
        int i, j;
        scanf ("%d", &n);   // give the value of n;
        for (i = 1; i <= n; i++)    // filling the matrix;
        {
            scanf ("%d%d", &v[i][0], &v[i][1]);
            z[i] = TWO_16 * v[i][0] + TWO_15 - v[i][1];
            vec[i] = i;
        }
        for (i = 1; i <= n; i++)
            for (j = 1; j <= i; j++)
            {
                if (z[j] > z[i])
                {
                    int t = vec[i];
                    vec[i] = vec[j];
                    vec[j] = t;
                }
            }
    
        for (i = 1; i <= n; i++)   // output the matrix
            printf("%d %d\n",v[vec[i]][0],v[vec[i]][1]);
        return 0;
    }
    

    但是在gcc中,输出是

    1 6
    3 5
    3 4
    1 2
    7 3
    

    此外,当第一行更改为“1 2”而第二行在输入中更改为“3 4”时,结果也会发生变化。

    我的代码有什么问题?

    其他信息:

    我使用z[]因为我使用的函数满足了这个问题的要求,所以我可以简单地对它们进行排序。并且vec[]存储原始索引,因为移动数组可能会花费大量时间。因此v[vec[i]][0]表示“新”数组的项i。 请注意,不使用v [0]。 n小于100000,不等于。

2 个答案:

答案 0 :(得分:2)

数组索引从0开始,因此你的cicles必须从0开始

if (z[j] > z[i]):您要对v进行排序,但您要比较z和排序vec。通过排序vec并比较z冒泡排序无法正常工作。您必须使用相同的数组。

答案 1 :(得分:2)

您正在比较z[]中存储的值,但交换vec的元素。 因此,当你在begginig时,你有:

i  vec      z
------------------
1   1     z[1]
2   2     z[2]
3   3     z[3]
...   

例如用3交换2

i  vec      z
------------------
1   1     z[1]
2   3     z[2]
3   2     z[3]
...

vecz之间的映射不正确。

因此,在另一次迭代中,您将再次将z[2]z[3]进行比较,然后您将不得不交换vec的元素。这就是为什么你至少应该使用z

的元素交换vec的元素或z的索引元素
i  vec      z
------------------
1   1    z[vec[1]] = z[1]
2   3    z[vec[2]] = z[3]
3   2    z[vec[3]] = z[2]
...

添加此功能应该可以解决问题

...
int t = vec[i];
vec[i] = vec[j];
vec[j] = t;
//Add this also when swapping vec
t = z[i];
z[i] = z[j];
z[j] = t;
...