为什么这个选择排序算法以这种奇怪的方式表现

时间:2018-01-10 19:59:01

标签: javascript c algorithm sorting selection-sort

我半睡半醒,所以我可能会忽略这里的一些事情,但发生的事情很奇怪。我在JavaScript中使用Wikipedia实现了Selection Sort算法。您可以在jsbin

下或在{{3}}

下查看代码

问题

我使用带有10000个随机生成的数字的for循环填充数组,因为它需要很多来显示问题。该算法按预期工作在9800以下的任何值。然而,对于10000个数字和一个空的未排序数组var unsorted = [];,最后一个数字是交替的,如9, 10, 9, 10, 9, 10, 9, 10 ...。如果我使用至少一个元素unsorted初始化var unsorted = [1];数组,则交替问题是固定的。

那么,为什么会发生这种情况呢?为什么在未排序的数组包含至少9800个数字时会发生这种情况?为什么在我通过for循环填充它之前初始化至少有一个数字的未排序数组时它是否已修复?

编辑

这个问题似乎总是不会发生,所以如果你第一次尝试时所有东西看起来都很整齐,那么再试几次。此外,我已经在Edge,Firefox和Opera上测试了它,并且浏览器出现问题。 (截至目前的最新版本)



var unsorted = [];

for (let i = 0; i < 10000; i++) {
  unsorted[i] = Math.floor(Math.random() * 11);
}

for (let j = 0; j < unsorted.length; j++) {
  let min = j;

  for (let i = j + 1; i < unsorted.length; i++) {
    if (unsorted[i] < unsorted[min]) {
      min = i;
    }
  }

  if (min != j) {
    [unsorted[j], unsorted[min]] = [unsorted[min], unsorted[j]]
  }
}

console.log(unsorted);
&#13;
&#13;
&#13;

编辑:使用C

进行测试

我这个月一直在学习C,我翻译了代码,看看它是如何用不同的语言表达的。答案 - 没有问题。一切都很好。以下是那些喜欢比较的人的代码。这并不意味着我对理解JavaScript中出现问题的原因并不感兴趣 而不是在C。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    int arrLen = 10000;
    int unsorted[arrLen];
    time_t t;
    srand((unsigned) time(&t));

    for (int i = 0; i < arrLen; i++)
    {
        unsorted[i] = rand() % 11;
    }

    for (int j = 0; j < arrLen; j++)
    {
        int min = j;

        for (int i = j + 1; i < arrLen; i++)
        {
            if (unsorted[i] < unsorted[min]) {
                min = i;
            }
        }

        if (min != j)
        {
            int tmp = unsorted[j];
            unsorted[j] = unsorted[min];
            unsorted[min] = tmp;
        }
    }

    for (int a = 0; a < arrLen; a++)
    {
        printf("%d-", unsorted[a]);
    }
    printf("\n");
}

0 个答案:

没有答案