使用'for'循环对包含数字的数组进行排序

4

我刚接触JavaScript,我有一个包含数字的数组。

 var arr = [2,4,8,1,5,9,3,7,6];

我该如何使用JavaScript中的本地for循环对其进行排序?

我知道有sort函数可用,但我想通过for循环来实现。

输出应为:

 var res = [1,2,3,4,5,6,7,8,9];

2
"使用For循环" - 你只需要一个单独的for循环,没有嵌套循环或递归吗?这是作业吗,你只是想要一些指导来开始吗?(我想不出其他原因为什么你要避免使用内置的.sort()函数。) - nnnnnn
2
有许多排序算法可以实现... https://en.wikipedia.org/wiki/Sorting_algorithm 这里没有一个标准答案。实际的现实世界答案arr.sort() - deceze
@Bob Deckard:那个陷阱的规范Stack Overflow问题是什么? - Peter Mortensen
一些低分重复的数字字符串陷阱(搜索引擎现在真的很糟糕):*如何在JavaScript中按数字排序字符串(2010年),如何在JavaScript中对数字字符串进行排序?(2020年)和JavaScript:对字符串数字数组进行排序*(2018年)。 - Peter Mortensen
一个关于字符串中带有一些数字的假阳性:*JavaScript中字母数字字符串的自然排序* - Peter Mortensen
11个回答

19

var Arr = [1, 7, 2, 8, 3, 4, 5, 0, 9];

for (var i = 1; i < Arr.length; i++)
    for (var j = 0; j < i; j++)
        if (Arr[i] < Arr[j]) {
            var x = Arr[i];
            Arr[i] = Arr[j];
            Arr[j] = x;
        }

console.log(Arr);


3
这个没有解释的回答使得提问者获得了一个“救生艇”徽章。这是什么?冒��排序吗?它的主要思想是什么?根据帮助中心的描述:“……你需要始终解释为什么你提出的解决方案是合适的以及它是如何工作的。”请通过编辑(修改)你的答案来回复,而不是在评论区回复(不要使用“编辑:”,“更新:”或类似的内容——答案应该看起来像是今天写的)。 - Peter Mortensen

3
我会像这样做...

var input = [2,3,8,1,4,5,9,7,6];

var output = [];
var inserted;

for (var i = 0, ii = input.length ; i < ii ; i++){
  inserted = false;
  for (var j = 0, jj = output.length ; j < jj ; j++){
    if (input[i] < output[j]){
      inserted = true;
      output.splice(j, 0, input[i]);
      break;
    }
  }

  if (!inserted)
    output.push(input[i])
}

console.log(output);

也许有更有效的方法,但如果您想使用for循环,这是我的第一个想法...

0

首先创建一个空数组,用于存储排序后的数字。

let sorted = [];

其次,创建大量数字,确保这些数字都不会与数组中的任何数字匹配。这个数字将用于第一次比较,以确定数组中哪个数字更小。

let comparison = 9000000000;

创建一个 for 循环。

此循环将包含另一个循环。内部循环将检查给定数组中最小的数字,并一旦获取到最小的数字,它将被推入我们创建的空数组中。最小的数字也将从初始数组中删除,然后再次运行该数组。

for(a = 0; a < arr.length; a++){

    //This inner loop fetches the smallest number.
    for(b = 0; b < arr.length; a++){
        if(comparison > arr[b]){
            comparison = arr[b];
        }
    }

    // The smallest number is assigned to comparison
    // Now it being pushed to the empty array
    sorted.push(comparison);

    // Remove the smallest number from the initial array

    let indexOfSmallNumber = arr.indexOf(comparison);
    arr.splice(indexOfSmallNumber, 1);

    // Set the comparison back to 9000000000;
    comparison = 90000000000;

    a = -1;
    // Here, "a" is our main loop index counter and we are
    // setting it to -1 because we don't want it to change
    // to 2 by default, doing this will make the loop run
    // forever until the initial array is empty.
}

0

使用:

let s = [4, 6, 3, 1, 2];
for (let i = 0; i < s.length;) {
    if (s[i] > s[i + 1]) {
        let a = s[i];
        s[i] = s[i + 1];
        s[i + 1] = a;
        i--;
    }
    else {
        i++;
    }
}

这是一种排序算法,其最佳时间复杂度为O(n),最坏时间复杂度为O(n^2)。

此代码检查每个数字,然后与左侧的所有数字进行比较。

要检查每个代码运行所需的时间,您还可以使用下面的代码:

let start = process.hrtime.bigint()
let end = process.hrtime.bigint()

console.log(end - start) // This measures the time used in nano seconds.

对于微秒级别的计时,您可以使用 performance.now() 方法。


2
请不要发布基本上只包含代码的答案。请[编辑]您的答案,包括解释代码如何解决问题,何时应该使用它,它的限制是什么,如果可能的话,请提供相关文档链接。 - ljmc
关于“排序算法”:哪一个?冒泡排序 - Peter Mortensen
这个回答看起来完全是胡扯的。它怎么可能在一次遍历中对数组进行排序呢?只是通过运气和示例数组吗?我不认为它能够处理问题中的示例 [2, 4, 8, 1, 5, 9, 3, 7, 6] - Peter Mortensen
@PeterMortensen 你试过运行这段代码吗?它的效果就像魔法一样。试着运行任何一个数组,你会发现它可以将其排序。 - abdullah ajibade
1
一个有趣的方法,但需要(至少)两个改变才能避免超出数组边界的读取:上限终止条件应该是 i < s.length - 1,而 i-- 应该有一个保护条件以防它变成负数。 - Alistair Ward
这是一个奇怪的 for 循环。它增加和减少循环变量 i。最好将其表达为“while”循环。这是一个非常复杂的冒泡排序吗?有人试图通过使用一个循环来实现冒泡排序而变得聪明吗?至少应该在答案中解释清楚。 - Peter Mortensen

0

这里有一个非常简单的解决方案,它使用一个临时数组来存储大于当前值的值。然后将当前值放置在较小和较大值之间:

var arr = [2,4,8,1,5,9,3,7,6];
var res = [];
for (const c of arr) {
    let tmp = [];
    while (c < res[res.length-1]) {
        tmp.unshift(res.pop());
    }
    res = [...res, c, ...tmp];
} 

0
let arr = [4, 2, 5, 1]
let temp;

function converter(arr) {

  for(let i=0; i<arr.length; i++) {

    for (let j=i+1; j<arr.length; j++) {

      if(arr[i] > arr[j]) {

        temp = arr[i]
        arr[i] = arr[j]
        arr[j] = temp
      }
    }
  }
  return arr
}

const newArr = converter(arr)
console.log(newArr)

2
你的回答可以通过添加更多支持信息来改进。请编辑你的回答,添加更多细节,例如引用或文档,以便其他人可以确认你的回答是正确的。你可以在帮助中心找到有关如何编写好的答案的更多信息。 - Syscall
这是至少一个先前答案的重复。它是什么?冒泡排序 - Peter Mortensen

-1
W3Schools的JavaScript数组排序部分中,它讲述了如何比较数组中的值,然后基于这些值的返回值进行排序。我更新了代码,使用for循环对值进行排序。

// Ascending points
var points = [5.0, 3.7, 1.0, 2.9, 3.4, 4.5];
var output = [];
var i;
for (i = 0; i < points.length; i++) {
    points.sort(function (a, b) {
        return a - b
    });
    output += points[i] + "<br>";
}
console.log(output);

// Descending points
var points = [5.0, 3.7, 1.0, 2.9, 3.4, 4.5];
var output = [];
var i;
for (i = 0; i < points.length; i++) {
    points.sort(function (a, b) {
        return b - a
    });
    output += points[i] + "<br>";
}
console.log(output);


由于这个问题是基于JavaScript的,我没有包含相应的HTML内容,所以我意识到这将只在控制台上产生一行结果。 - WELCHDK
很久以前的事了,但是...你一遍又一遍地排序。你只需要 points.sort(function(a,b) { return a-b }); console.log(points);。但这个答案并不是很有帮助,因为问题中包含“使用本机For Loop”。 - Holger

-1

for (let i = 0; i < numbers.length; i++) {
  for (let j = i + 1; j < numbers.length; j++) {
    if (numbers[i] > numbers[j]) {
      const temp = numbers[i];
      numbers[i] = numbers[j];
      numbers[j] = temp;
    }
  }
}


3
这个逻辑不能用于示例 [4, 6, 3, 1, 2] - dipenparmar12
这是冒泡排序吗?交换操作出了问题。只有一个花哨的异或操作可以避免使用临时变量。为什么会被点赞? - Peter Mortensen
for (let i = 0; i < numbers.length; i++) { for (let j = i + 1; j < numbers.length; j++) { if (numbers[i] > numbers[j]) { const temp = numbers[i]; numbers[i] = numbers[j]; numbers[j] = temp; } } } - sabarinath

-1
const array = [12, 3, 45, 61, 23, 45, 6, 7];

function sortArray(array) {
    for (var i = 0; i < array.length; ++i) {
        for (var j = 0; j < array.length - 1 - i; ++j) {
            if (array[j] > array[j + 1]) {
                [array[j], array[j + 1]] = [array[j + 1], array[j]];
            }
        }
    }
    return array;
}

console.log(sortArray(array));

2
尝试添加一些注释和额外的信息,有助于理解代码。这将帮助人们轻松地在不同答案之间进行评估。 - Neel
需要解释一下。例如,什么是想法/要点?来自帮助中心:“始终解释为什么您提出的解决方案是合适的以及它如何工作”。请通过编辑(更改)您的答案进行回复,而不是在此处进行评论(不包括“Edit:”,“Update:”或类似内容-答案应该看起来像今天写的)。 - Peter Mortensen

-1

这是同一个算法的两个解决方案:

解决方案1:

我们可以直接使用JavaScript函数:

let arr = [2, 4, 8, 1, 5, 9, 3, 7, 6]

const changeOrder = (arr) => {
    return arr.sort((a, b) => a - b)
}

let result = changeOrder(arr);

console.log(result) // [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]

解决方案2:

我们可以使用 JavaScript 的 for 循环来实现相同的功能。

let arr = [2, 4, 8, 1, 5, 9, 3, 7, 6]

const changeOrder = (arr) => {
    for(let i=1; i< arr.length; i++) {
        for(let j=0; j < i; j++) {
            if(arr[i] < arr[j]) {
                let x = arr[i]
                arr[i] = arr[j]
                arr[j] = x
            }
        }
    }
    return arr;
}

let result = changeOrder(arr);
console.log(result) // [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]

最后一部分是做什么的?实现冒泡排序吗? - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接