C 相对于另一个数组重新排列数组

C 相对于另一个数组重新排列数组,c,arrays,loops,sorting,brute-force,C,Arrays,Loops,Sorting,Brute Force,我有两个并行阵列: defenders = {1,5,7,9,12,18}; attackers = {3,10,14,15,17,18}; 两者都已排序,我正在尝试重新排列防御阵列的值,以便它们赢得更多游戏(defender[I]>attacker[I]),但我在如何交换防御阵列中的值方面遇到了问题。所以在现实中,我们只与防御者阵列合作对付攻击者 我有这个,但如果有什么变化的话,它不会有太大的变化,我很确定我做得不对。它被认为是一种暴力手段 void rearrange(int* attac

我有两个并行阵列:

defenders = {1,5,7,9,12,18};
attackers = {3,10,14,15,17,18};
两者都已排序,我正在尝试重新排列防御阵列的值,以便它们赢得更多游戏(defender[I]>attacker[I]),但我在如何交换防御阵列中的值方面遇到了问题。所以在现实中,我们只与防御者阵列合作对付攻击者

我有这个,但如果有什么变化的话,它不会有太大的变化,我很确定我做得不对。它被认为是一种暴力手段

void rearrange(int* attackers, int* defenders, int size){
int i, c, j;
int temp;

for(i = 0; i<size; i++){
  c = 0;
  j = 0;
  if(defenders[c]<attackers[j]){
            temp = defenders[c+1];
            defenders[c+1] = defenders[c];
            defenders[c] = temp;
            c++;
            j++;
     }
    else
        c++;
        j++;

   }
}
void重排(int*攻击者、int*防御者、int大小){
int i,c,j;
内部温度;

对于(i=0;i而言,问题在于在循环的每次迭代中将c和j重置为零。因此,您只会比较每个数组中的第一个值

另一个问题是,如果防御者数组的最后一个值小于攻击者数组的最后一个值,您将在防御者数组末尾读取一个值

另一个问题或者说是奇怪的是,在if语句的两个分支中,c和j都在递增。如果这是您真正想要的,那么c和j是无用的,您可以使用i


我会为您提供一些更新的代码,但对您试图实现的目标没有足够好的描述;我只能指出显而易见的问题。

问题是,在循环的每次迭代中,您都会将c和j重置为零。因此,您只会比较每个数组中的第一个值

另一个问题是,如果防御者数组的最后一个值小于攻击者数组的最后一个值,您将在防御者数组末尾读取一个值

另一个问题或者说是奇怪的是,在if语句的两个分支中,c和j都在递增。如果这是您真正想要的,那么c和j是无用的,您可以使用i

我会为您提供一些更新的代码,但对您试图实现的目标没有足够好的描述;我只能指出显而易见的问题。

老实说,我没有看您的代码,因为我必须在不到2.30小时内起床去上班,希望您不会对我有不快的感觉:)


我实现了Eugene Sh提出的建议。在深入研究代码之前,您可能需要先阅读一些链接:

  • 我的做法:

  • 通过扫描
    att
    def
    创建合并阵列
  • 对合并数组进行排序

  • 用符合ad模式的值重新加注
    def

  • 用剩余的值(即 失败)*
  • *第3步和第4步在我的方法中需要两次通过,也许它可以变得更好

    老实说,我没有看你的代码,因为我必须在不到2.30小时内起床去上班,希望你不会对我有不好的感觉:)


    我实现了Eugene Sh提出的建议。在深入研究代码之前,您可能需要先阅读一些链接:

  • 我的做法:

  • 通过扫描
    att
    def
    创建合并阵列
  • 对合并数组进行排序

  • 用符合ad模式的值重新加注
    def

  • 用剩余的值(即 失败)*
  • *第3步和第4步在我的方法中需要两次通过,也许它可以变得更好


    您正在每个循环的开始处初始化
    c
    j
    。可以吗?注意:小心不要导致超出范围的访问。@MikeCAT我这样做是为了使c和j不会变成巨大的数字。我也有一个if语句来限制c+1,但没有太多作用。可能是@gsamaras的副本是的,我编辑了我的帖子以包含我的解释ionYou正在每个循环的开头初始化
    c
    j
    。可以吗?注意:小心不要导致超出范围的访问。@MikeCAT我这样做是为了使c和j不会变成巨大的数字。我也有一个if语句来限制c+1,但没有太多作用。可能是@gsamaras的副本是的,我编辑了我的帖子以包含我的解释nationNow我觉得我应该添加我的全部代码,我有点不确定如何添加它,但我扫描了我的2个数组中的值(defender/攻击者)这两个都是动态分配的。然后我在两个数组上都调用了mergesort。这就是我在最初的问题中得到最终结果数组的方式。我不确定我可以多么容易地使用一个结构,但我可以尝试一下我现在使用的方法@Jude,效果很好。希望它能有所帮助。:D你可以重新思考一下为什么你的方法在fi中不起作用第一位。还有一个很好的问题,+1。@Jude为什么不使用struct?因为数组是动态分配的?使用数组时没有什么区别(如果它们是动态分配的或不是!!).真的吗?我没有看到任何地方提到@TomKarzes。即使是这样,我希望他会认真研究我的答案并学习!不管怎样,谢谢你的投票。:)好吧,这是一个重复的(本应如此关闭).在这篇文章之前还有两篇相同的文章。所以,是的,家庭作业。现在我觉得我应该添加我的全部代码,我有点不确定如何添加,但我扫描了我的2个数组中的值(防御者/攻击者)这两个都是动态分配的。然后我在两个数组上都调用了mergesort。这就是我在最初的问题中得到最终结果数组的方式。我不确定我可以多么容易地使用一个结构,但我可以尝试一下我现在使用的方法@Jude,效果很好。希望它能有所帮助。:D你可以重新思考一下为什么你的方法在fi中不起作用第一位。还有一个很好的问题,+1。@Jude为什么不使用struct?因为数组是动态分配的?在使用数组时(无论它们是否是动态分配的!!)没有什么区别。真的吗?我没有看到任何地方提到@TomKarzes。即使这是
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct {
      char c; // a for att and d for def
      int v;
    } pair;
    
    void print(pair* array, int N);
    void print_int_array(int* array, int N);
    // function to be used by qsort()
    int compar(const void* a, const void* b) {
        pair *pair_a = (pair *)a;
        pair *pair_b = (pair *)b;
        if(pair_a->v == pair_b->v)
            return pair_b->c - pair_a->c; // d has highest priority
        return pair_a->v - pair_b->v;
    }
    
    int main(void) {
        const int N = 6;
        int def[] = {1, 5, 7, 9, 12, 18};
        int att[] = {3, 10, 14, 15, 17, 18};
        int i, j = 0;
        // let's construct the merged array
        pair merged_ar[2*N];
        // scan the def array
        for(i = 0; i < N; ++i) {
            merged_ar[i].c = 'd';
            merged_ar[i].v = def[i];
        }
        // scan the att array
        for(i = N; i < 2 * N; ++i) {
            merged_ar[i].c = 'a';
            merged_ar[i].v = att[j++]; // watch out for the pointers
            // 'merged_ar' is bigger than 'att'
        }
        // sort the merged array
        qsort(merged_ar, 2 * N, sizeof(pair), compar);
        print(merged_ar, 2 * N);
        // scan the merged array
        // to collect the patterns
        j = 0;
        // first pass to collect the patterns ad
        for(i = 0; i < 2 * N; ++i) {
            // if pattern found
            if(merged_ar[i].c == 'a' &&     // first letter of pattern
               i < 2 * N - 1         &&     // check that I am not the last element
               merged_ar[i + 1].c == 'd') {     // second letter of the pattern
                def[j++] = merged_ar[i + 1].v;  // fill-in `def` array
                merged_ar[i + 1].c = 'u';   // mark that value as used
            }
        }
        // second pass to collect the cases were 'def' loses
        for(i = 0; i < 2 * N; ++i) {
            // 'a' is for the 'att' and 'u' is already in 'def'
            if(merged_ar[i].c == 'd') {
                def[j++] = merged_ar[i].v;
            }
        }
        print_int_array(def, N);
        return 0;
    }
    
    void print_int_array(int* array, int N) {
        int i;
        for(i = 0; i < N; ++i) {
            printf("%d ", array[i]);
        }
        printf("\n");
    }
    
    void print(pair* array, int N) {
        int i;
        for(i = 0; i < N; ++i) {
                    printf("%c %d\n", array[i].c, array[i].v);
            }
    }
    
    gsamaras@gsamaras:~$ gcc -Wall px.c
    gsamaras@gsamaras:~$ ./a.out 
    d 1
    a 3
    d 5
    d 7
    d 9
    a 10
    d 12
    a 14
    a 15
    a 17
    d 18
    a 18
    5 12 18 1 7 9