你可以通过走一次阵列来做到这一点,从0到它的最后一个元素。你只需要考虑你需要比较什么,或者交换“当前”元素,它变得很容易。
您必须保留一些额外的变量来跟踪当前元素,以及需要将其与其他元素进行比较。
另外,您可能需要查看主要的C代码格式样式。没有任何风格让每个人都百分之百快乐,但有很多风格让每个人都不快乐。
---- ----编辑
好吧,这更像是比一个严重的计算机科学问题“脑筋急转弯”的问题。问题在于“额外内存”的定义很差,所以如果您只记得编程语言允许递归,那么您可以通过很多方法实现结果,而that a recursive call requires extra stack(没有人会将内存分配视为它是编程语言实现所要求的)。
基本上,这样的问题是要看你是否看问题,看到递归解决方案。
#include <stdio.h>
void sort(int index, int start1, int end1, int start2, int end2, int* array) {
if (index >= end2) {
return;
}
int lower;
if (array[start1] <= array[start2]) {
lower = array[start1];
sort(index+1, start1+1, end1, start2, end2, array);
} else {
lower = array[start2];
sort(index+1, start1, end1, start2+1, end2, array);
}
array[index]=lower;
}
int main(int argc, char** argv) {
int a[] = {1,3,6,8,-5,-2,3,8};
sort(0, 0, 3, 4, 7, a);
int i;
for (i = 0; i <= 7; i++) {
printf("%d, ", a[i]);
}
printf("\n");
return 0;
}
这是一个骗子吗?你决定。然而,这种排序是在原地完成的,缓存的数字在堆栈调用中整齐地放在本地空间中,在那里你不能真正分配/取消分配它们。
额外优化是可能的,但它们是核心思想的改进:使用递归和调用堆栈来缓存信息。
我格式化你的代码有点(使用编辑器上方的'{}'按钮),但我认为这可能是整洁 - 你可以尝试编辑您的问题,使之清晰。 – 2011-05-27 14:50:55
@Damien,格式化它更好,并添加缺少的变量类型。 – 2011-05-27 14:53:24
正在做作业吗? – Blazes 2011-05-27 14:53:25