javascript - Javascript 中的波浪排序

标签 javascript algorithm sorting

我写了一个函数来执行 wave-sort如下所示。生成的数组应该以比下一个更大的数字开头,但我的代码没有这样做。例如,如果输入是:

[73, 80, 40, 86, 14, 96, 10, 56, 61, 84, 82, 36, 85]

...它给出了输出

[ 86, 96, 84, 85, 80, 82, 61, 73, 40, 56, 14, 36, 10 ]

而不是从比下一个更大的数字开始,即 96

function waveSort(arr){
    arr = arr.sort(function(a, b) {
        return b - a; 
    });

    for (var i = 1; i < arr.length; i += 2) {
        if (arr[i-1] > arr[i]) {
            var temp = arr[i];
            arr[i] = arr[i-1];
            arr[i-1] = temp;
        }
        if (i+1 < arr.length && arr[i+1] > arr[i]) {
            temp = arr[i];
            arr[i] = arr[i+1];
            arr[i+1] = temp;
        }
    }
    return arr;
}

最佳答案

您已明确设计您的函数以较低的值开始。

在第一个 if 中,您检测到第一个值大于第二个值的情况,如果是,则交换它们(当 i = 1 时):

if (arr[i-1] > arr[i]) {

所以在索引 0 处得到的值比在索引 1 处得到的值小是正常的。

如果您希望您的阵列以“波高”开始,则更改两个 if 中的条件:

function waveSort(arr){
    arr = arr.sort(function(a, b) {
        return b - a; 
    });

    for (var i = 1; i < arr.length; i += 2) {
        if (arr[i-1] < arr[i]) {
            var temp = arr[i];
            arr[i] = arr[i-1];
            arr[i-1] = temp;
        }
        if (i+1 < arr.length && arr[i+1] < arr[i]) {
            temp = arr[i];
            arr[i] = arr[i+1];
            arr[i+1] = temp;
        }
    }
    return arr;
}

var waved = waveSort([73, 80, 40, 86, 14, 96, 10, 56, 61, 84, 82, 36, 85]);
console.log(JSON.stringify(waved));

关于javascript - Javascript 中的波浪排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45507065/

相关文章:

python - Python 中的 Chudnovsky 公式

algorithm - 反转替代元素并附加到列表末尾

c# - List.Sort 在 C# : comparer being called with null object

javascript - new Date() 在 Chrome 和 Firefox 中的工作方式不同

javascript通过原型(prototype)链继承不起作用

javascript - 使用数组更新本地存储值

对 JPQL 实体列表进行排序

java - 将表单输入从 servlet 重定向到另一个表单

algorithm - 找到总和相同且长度相同的子数组

javascript - 动态加载列表项并对它们进行排序,两个脚本都分开工作,但它们不能一起工作。 (包括 JSFiddle)