在javascript中合并排序的简单实现
Simple implementation of merge sort in javascript
遵循合并排序算法的实现有什么问题。 它只是返回未定义。
我怀疑错误在合并函数的某个地方。
有人可以帮我指出错误吗?
function mergeSort(arr1, lower, higher) {
if (lower < higher) {
var mid = Math.floor((lower + higher) / 2);
mergeSort(arr1, lower, mid);
mergeSort(arr1, mid + 1, higher);
merge(arr1, lower, mid, higher);
}
}
和合并功能
function merge(arr1, lower, mid, higher) {
var i = lower;
var j = mid + 1;
var k = 0;
var mergearr = [];
while (i < j && j <= higher) {
if (arr1[i] <= arr1[j]) {
mergearr[k] = arr1[i];
k++;
i++;
} else {
mergearr[k] = arr1[j];
k++;
j++;
}
}
if (i === j) {
while (j < higher) {
mergearr[k] = arr1[j];
k++;
j++;
}
} else if (j > higher) {
while (i < j) {
mergearr[k] = arr1[i];
k++;
i++;
}
}
for (var a = 0; a <= k; a++) {
console.log(a);
arr1[a] = mergearr[a];
console.log(arr1[a]);
}
return arr1;
}
这是控制台上的输出
index: 0
value: 4
index: 1
value: 5
index: 2
value: 4
index: 3
value: undefined
index: 0
value: 4
index: 1
value: 4
index: 2
value: 5
index: 3
value: 4
index: 4
value: undefined
index: 0
value: undefined
index: 1
value: 4
index: 2
value: undefined
index: 3
value: undefined
index: 0
撇开排序中可能的"off-by-1"错误不谈,merge()
函数在将合并列表复制回源数组的方式上存在问题。该函数被告知从lower
合并到higher
,它确实如此。但随后,合并的数组将从索引 0 开始复制回原始数组。相反,您需要确保原始数组仅在lower
和higher
之间修改:
for (var a = 0; a <= k; a++) {
console.log(a);
arr1[a + lower] = mergearr[a]; // <--- here
console.log(arr1[a + lower]);
}
我可以调整你的代码。是的,问题出在您的merge()
功能上。看一看:
- 您不需要从
merge()
返回任何内容,因为此值不在任何地方使用。 -
a
应该从每次递增的lower
开始以避免重写数组中已经排序的部分 - 你拾取奇数指数值的结构很奇怪,腹胀
- 你在函数的开头也搞砸了索引
var arr = [5,3,7,8,1,2,6,3,2];
mergeSort(arr, 0, arr.length - 1);
console.log(arr);
function mergeSort(arr, lower, higher) {
if (lower < higher) {
var mid = Math.floor((lower + higher) / 2);
mergeSort(arr, lower, mid);
mergeSort(arr, mid + 1, higher);
merge(arr, lower, mid, higher);
}
}
function merge(arr, lower, mid, higher) {
var l = mid-lower+1, r = higher-mid, k = lower, mergearr = [], i = 0, j = 0;
while (i < l && j < r) {
if (arr[lower+i] <= arr[mid+j+1]) {
mergearr[k] = arr[lower+i]; i++;
} else {
mergearr[k] = arr[mid+j+1]; j++;
}
k++;
}
while (j < r) {
mergearr[k] = arr[mid+j+1]; k++; j++;
}
while (i < l) {
mergearr[k] = arr[lower+i]; k++; i++;
}
//console.log(mergearr, k, lower);
for (var a = lower; a < k; a++) {
arr[a] = mergearr[a];
}
}
相关文章:
- 实现简单的javascript转盘.(无插件)
- html表单,它有文本和表,现在我想在一个简单的文本文件中保存和检索数据,如何实现它
- 我该如何实现CSS/HTML中使用密码字段的非常简单的文本框提示
- 在Node.js中实现服务器发送事件的简单方法
- 将cookie实现为简单的秒表
- 在 JavaScript 中实现简单继承
- 最简单的实现方式是网页上的动态更新表(java/css)
- 使用角度从ng重复,简单的购物车实现中添加和删除项目
- 如何简单地实现谷歌注销那种“点击任何地方关闭”类型的功能
- 如何在 JavaScript 中实现一个简单的优先级侦听器模式
- 实现用于 JavaFx2.0 游戏框架的简单状态机
- 锤子.js - 简单实现“拖放”DIV
- 用Selfish实现Javascript中的简单继承
- 我怎么能在Backbone中简单地实现类Sencha继承呢
- 有没有一种更简单的方法可以在JavaScript中实现概率函数
- 实现简单web服务项目的最简单方法
- 困惑于如何编写OO Javascript来实现简单的类模式
- 实现基于浏览器宽度的大图像背景拉伸的最简单方法
- 用javascript实现if-then-else-if-else堆栈的更简单方法是什么
- 在javascript中合并排序的简单实现