我该怎么做排序数组?

时间:2016-12-11 12:54:00

标签: c arrays sorting

我尝试排除那些已经被选为最大数字但却没有工作的人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;

}

2 个答案:

答案 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]。

当你走向终点时,它会大大加快。