【问题标题】:What should I do for sort array?我应该为排序数组做什么?
【发布时间】:2017-04-26 11:10:27
【问题描述】:

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

}

【问题讨论】:

标签: c arrays sorting


【解决方案1】:

使用 i 和 j。

N 是 10,数据由 0 到 N-1 的随机数字组成。

j 从 0 到 N-1。在每一步,你想用 未处理输入的最大值。

所以 i 在内部循环中从 j+1 到 N-1。如果 arr[j]

当你接近终点时,它会大大加快速度。

【讨论】:

    【解决方案2】:

    这里有几个错误:

    数组store的大小为10,但是在jth通过外循环时,只填充了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;
    }
    

    【讨论】:

      猜你喜欢
      • 2017-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-22
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多