我需要对数组中的奇数或偶数进行排序,同时保持其余的不变。由于这是内存管理课程的一部分,我强烈希望不要复制任何数据,所以我没有选择明显的解决方案。只对数组中的奇数或偶数排序
我想通过跳过比较的“坏”第一或第二参数来使用简单的气泡排序功能。我只会发布该函数,因为其余部分都是不相关的。
//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
任何帮助或建议将不胜感激,优选地具有解释不只是一个解决方案。
编辑::完整的程序是在这里,不希望混乱的问题http://pastebin.com/vZDcmppV
请选择一种语言,C或C++。使用C++,它大约是使用算法函数的3或4行解决方案。 – PaulMcKenzie
@PaulMcKenzie我做到了,对不起,没想到它很重要。我更感兴趣的是为什么我的方法不起作用,而不是更好的解决方案。 – aron9forever
这是学习如何使用调试器的绝佳机会,如果以前没有做过。使用调试器,您可以逐行执行代码,同时监视变量及其值。通过这种方式,您可以看到代码的真实情况。或者,您可以先尝试一些[橡皮鸭调试](https://en.wikipedia.org/wiki/Rubber_duck_debugging)。 –