我需要按照从大到小的顺序打印一个数组。为简单起见,我们会说它是一个整数数组。
我能想到的唯一方法就是遍历数组,找到最大的元素,打印它并设置一个相应的布尔标志,这样就不会打印两次。有没有更好的方法来解决这个问题?
int *array;
// Fill array, malloc, all that good stuff
int i, j, max = 0, max_index = 0;
int isPrinted[ARRAY_SIZE] = {0};
for (i = 0; i < ARRAY_SIZE; i++) {
for (j = 0; j < ARRAY_SIZE; j++) {
if (isPrinted[j] == 0 && array[j] > max) {
max = array[j];
max_index = j;
}
}
isPrinted[max_index] = 1;
printf("%d", max);
max = 0;
}
答案 0 :(得分:3)
是..在打印前排出数组,然后打印出来。 如果您无法修改原始数组,请将元素复制到另一个元素,然后按正确顺序插入它们并打印第二个元素。
答案 1 :(得分:1)
您不能对数组进行排序然后打印吗?或者复制数组,对副本进行排序并打印出来?使用您的算法,复杂性会更好(O(n log(n))而不是O(n ** 2)。
答案 2 :(得分:1)
对其进行排序,然后打印出来。对于整数,可以在线性时间内完成此操作。使用标准qsort
,O(n*log(n))
。
// stdlib.h
void qsort( void *buf, size_t num, size_t size, int (*compare)(const void *, const void *) );
答案 3 :(得分:0)
我认为你最好选择一种排序算法,按照你想要的方式重新排序你的数组。然后按顺序打印数组的内容。
答案 4 :(得分:0)
如果您可以更改元素的顺序,则可以在打印前对阵列使用排序算法。
答案 5 :(得分:0)
正如其他人所指出的那样,首先对数据进行排序通常会更有效。
但是,您可以将数据放入优先级队列,并将项目从优先级队列中删除,而不是对数据进行完全排序。虽然它不是巨大的差异(无论如何),但与完全排序数据相比,这确实减少了工作量。