我尝试排除那些已经被选为最大数字但却没有工作的人arr
。
结果如下:
按照我的意图,在第一个周期,商店为{9, 0, 0, 0, 0 ... }
,当arr[i]
变为9
时,应跳过剩余的流程。我必须在没有附加功能的情况下对其进行排序,这对我来说太难了。有什么问题?
int i = 0;
int j = 0;
int num = 0;
int sign = 0;
int arr[10] = { 1,5,3,4,8,7,5,9,8,0 };
int max = arr[0];
int store[10] = { 0 };
int k = 0;
for (j = 0; j < 10; j++) {
printf("store: ");
for (int n = 0; n < 10; on++)
printf("%d ", store[n]);
printf("\n");
for (i = 0; i < 10; i++) {
sign = 0;
k = 0;
while (k < 10) {
if (arr[i] == store[k]) {
sign = 1;
break;
}
k++;
}
if (sign == 1) {
continue;
}
if (arr[i] > max) {
max = arr[i];
}
}
store[j] = max;
}
答案 0 :(得分:1)
这里有几个错误:
数组store
的大小为10,但在j
通过外循环时,只填充了j
个值;其余的仍然是零。因此,无论何时迭代store
,都应使用j
作为上限。
您正在寻找每次迭代的最大值。因此,仅在外循环之外初始化max
是不够的。你做到了,它将永远保持9。您应该为每max
重置j
。
最后,您通过数组查看是否已经处理了某个值的想法不起作用。你的阵列有重复,两个8和两个5。您只需在策略中放置一个八位一和五位,并为最后两个元素重复使用max
的最后一个值。 (另外,这个想法导致O(n³)代码,这非常浪费。
您可以通过在存储的位置保留一个额外的数组来解决这个问题,无论是(1
)还是没有(0
)您已经处理了某个索引处的值,或者通过在数组的值非常低。
您要实现的是选择排序:在整个列表中找到最大值并将其移到前面。然后找到除第一个项目之外的整个列表中的最大值,并将其移动到第二个插槽,依此类推:
* 1 5 3 4 8 7 5 9 8 0
9 * 5 3 4 8 7 5 1 8 0
9 8 * 3 4 5 7 5 1 8 0
9 8 8 * 4 5 7 5 1 3 0
9 8 8 7 * 5 4 5 1 3 0
9 8 8 7 5 * 4 5 1 3 0
9 8 8 7 5 5 * 4 1 3 0
9 8 8 7 5 5 4 * 1 3 0
9 8 8 7 5 5 4 3 * 1 0
9 8 8 7 5 5 4 3 1 * 0
9 8 8 7 5 5 4 3 1 0 *
此处,星号左侧的所有项目均已排序,星号右侧的所有项目仍未排序。当*
(位置j
)向右移动时,整个数组都会被排序。
这种就地:它破坏了数组的原始顺序。这很有用,因为元素的位置告诉我们它是否已被处理。在第三次迭代中,算法可以区分已排序的8和尚未排序的8。 (这种类型通常被描述为对一手牌进行排序:查看最低牌,将其放在左侧,依此类推。如果必须排序到第二个阵列,请复制原始阵列并对副本进行排序。)
以下是对您的数组进行排序并打印出上图的代码:
#include <stdlib.h>
#include <stdio.h>
int main()
{
int arr[10] = {1, 5, 3, 4, 8, 7, 5, 9, 8, 0};
int i = 0;
int j = 0;
for (j = 0; j < 10; j++) {
int imax = j;
int swap = arr[j];
// print array
for (i = 0; i < 10; i++) {
if (i == j) printf("* ");
printf("%d ", arr[i]);
}
printf("\n");
// find index of maximum item
for (i = j + 1; i < 10; i++) {
if (arr[i] > arr[imax]) {
imax = i;
}
}
// swap first unsorted item and maximum item
arr[j] = arr[imax];
arr[imax] = swap;
}
// print fully sorted array
for (i = 0; i < 10; i++) {
printf("%d ", arr[i]);
}
printf("*\n");
return 0;
}
答案 1 :(得分:0)
使用i和j。
N为10,数据由随机数字0到N-1组成。
j从0变为N-1。在每一步,您都想填写它 未处理输入的最大值。
所以我在内循环中从j + 1到N-1。如果arr [j]&lt; ARR [I], swap arr [i]和arr [j]。
当你走向终点时,它会大大加快。