gpt4 book ai didi

c - 对于排序数组我应该做什么?

转载 作者:行者123 更新时间:2023-11-30 15:02:19 25 4
gpt4 key购买 nike

我尝试通过排除那些已被选为最大数字的内容来对 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;

}

最佳答案

这里有几个错误:

数组store的大小为10,但在第j次通过外循环时,只填充了j个值在;其余的仍然为零。因此,每当您迭代 store 时,都应该使用 j 作为上限。

您正在寻找每次迭代中的最大值。因此,在外循环之外初始化一次 max 是不够的。你这样做了,之后它就会一直保持在 9。您应该为每个 j 重置 max

最后,你的想法是通过数组来查看是否已经处理了某个值,这是行不通的。您的数组有重复项,两个 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;
}

关于c - 对于排序数组我应该做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41086396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com