2017-03-22 97 views
1

我需要对数组中的奇数或偶数进行排序,同时保持其余的不变。由于这是内存管理课程的一部分,我强烈希望不要复制任何数据,所以我没有选择明显的解决方案。只对数组中的奇数或偶数排序

我想通过跳过比较的“坏”第一或第二参数来使用简单的气泡排序功能。我只会发布该函数,因为其余部分都是不相关的。

//these are passed as sort_type_remainder 
#define REMAINDER_EVEN 0 
#define REMAINDER_ODD 1 

void sort_integers(int *integer_list, int num_integers, int sort_type_remainder) 
{ 
    int i, j, aux, offset = 1; 
    for(i = 0; i < num_integers - 1; i++) 
    { 
     offset = 1; 
     for(j = 0; j + offset < num_integers - i; j++) 
     { 
      if(abs(integer_list[j] % 2) != sort_type_remainder) //first element to be compared is of wrong type, skip 
      { 
       j++; 
      } 
      else 
      { 
       //first element is of good type, but second element is not, increase offset and reloop first element 
       if(abs(integer_list[j + offset] % 2) != sort_type_remainder) 
       { 
        j--; 
        offset++; 
       } 
       else //both elements are of good type, bubble sort them 
       { 
        if(integer_list[j] > integer_list[j + offset]) 
        { 
         aux = integer_list[j + offset]; 
         integer_list[j + offset] = integer_list[j]; 
         integer_list[j] = aux; 
        } 
        offset = 1; 
       } 
      } 
     } 
    } 
} 

这种工作,但一些输入处理不当,我不明白为什么。我尝试减小输入大小以获得更简单的方法来重现此问题,但只要我这样做,它就能正常工作。

这里是输入/输出,我删除了偶数,因为他们留在他们的位置,它使得错误更容易注意到。

odd 
20 
13 5 -3 4 2 -7 23 -33 1 6 -8 7 10 -51 9 -5 12 92 69 55 

output

任何帮助或建议将不胜感激,优选地具有解释不只是一个解决方案。

编辑::完整的程序是在这里,不希望混乱的问题http://pastebin.com/vZDcmppV

+0

请选择一种语言,C或C++。使用C++,它大约是使用算法函数的3或4行解决方案。 – PaulMcKenzie

+0

@PaulMcKenzie我做到了,对不起,没想到它很重要。我更感兴趣的是为什么我的方法不起作用,而不是更好的解决方案。 – aron9forever

+1

这是学习如何使用调试器的绝佳机会,如果以前没有做过。使用调试器,您可以逐行执行代码,同时监视变量及其值。通过这种方式,您可以看到代码的真实情况。或者,您可以先尝试一些[橡皮鸭调试](https://en.wikipedia.org/wiki/Rubber_duck_debugging)。 –

回答

0

如果你需要从一个阵列奇数或偶数号码进行排序,这是我的方法:

我会首先从起始数组中选取所有奇数或偶数,具体取决于您想要做什么,用指标取代所有数字(1或2取决于您想排序的赔率还是平均数)。

然后自行对数组进行排序(如果您想使用除泡泡排序以外的其他算法,非常有用)。

然后你只需扫描你的第一个数组,通过取代每个指定的数字取决于它们的位置。

简而言之:

你想要把每个奇(甚至)数量从阵列1到阵列2,并通过指标取代它们(东西后scaning阵列1,当你可能认识)。

要排序数组2.

那么你一定要通过每一个元素从数组来代替每个指示灯2.

+0

您可能想要发布一些示例代码,示例数据结构或其他内容,因为我不明白您的建议。 –

+0

我刚刚编辑了一个简短的解释。 –

+0

感谢您的输入,但是您忽略了我提到的第二句话,我想避免重复数据。 – aron9forever