C中X-Y坐标的递归冒泡排序

时间:2018-02-20 08:28:34

标签: c

我想对与X

相关联的元素进行排序

该方法不是以递归的方式尝试,任何想法如何做

预期输出为: {5,73},{11,19},{11,34},{11,68},{13,5}

到目前为止,我已尝试过此操作,但只有X在Y保持原始位置时排序

void sort(struct Points a[], int n)
        {

            if (n == 1) return;

            for (int i=0; i<n-1; i++)
                if (a[i].X > a[i+1].X)
                    swap(&a[i].X, &a[i+1].X);

            //sort(&a[0], n);

        }
    struct Points {
        int X, Y;
    };

    void swap(int *a, int *b)
    {
        int t;

        t  = *b;
        *b = *a;
        *a = t;
    }


        void sort(struct Points a[], int n);

        int main()
        {
            int i;
            struct Points ptArray[5] = { {11, 34}, {5, 73}, {11, 19}, {13, 5}, {11,
                68}};

            sort(ptArray, 5);


            for (i = 0; i < 5; i++){
                printf("(%d, %d)\n", ptArray[i].X, ptArray[i].Y);
            }

            return 0;
        }

2 个答案:

答案 0 :(得分:0)

您的代码中存在一些问题:

[1]你要交换Points对象,这样修改后的swap函数看起来

void swap(Points *a, Points *b)
{
    Points t;

    t  = *b;
    *b = *a;
    *a = t;
}

[2]现在你只是通过检查X坐标来排序元素,你没有条件检查Y - 值

[3]当你想递归调用sort函数时,n参数必须在调用函数之前递减

sort功能应该是

void sort(struct Points a[], int n)
{    
  if (n > 1)
  {
    for (int i=0; i<n-1; i++)
        if (a[i].X > a[i+1].X || (a[i].X == a[i+1].X && a[i].Y > a[i+1].Y))
            swap(&a[i], &a[i+1]);
    sort (a,--n);
  }
}

答案 1 :(得分:0)

完整的工作代码 -

struct point{
    int x; int y;
};

bool isGreater(point p1, point p2){
    if(p1.x>p2.x) return true;
        else if(p1.x==p2.x){
            return p1.y>p2.y;
        }
    return false;
}

void recBubble(point *arr, int n){
    if (n == 1) return;

    for (int i=0; i<n-1; i++)
        if (isGreater(arr[i],arr[i+1]))
            swap(arr[i], arr[i+1]);
    recBubble(arr, n-1);
}