用JavaScript 写一个归并排序
时间: 2023-08-31 11:33:16 浏览: 80
### 回答1:
好的,我可以回答这个问题。以下是用 JavaScript 实现归并排序的代码:
function mergeSort(arr) {
if (arr.length <= 1) {
return arr;
}
const mid = Math.floor(arr.length / 2);
const left = arr.slice(, mid);
const right = arr.slice(mid);
return merge(mergeSort(left), mergeSort(right));
}
function merge(left, right) {
const result = [];
let i = ;
let j = ;
while (i < left.length && j < right.length) {
if (left[i] < right[j]) {
result.push(left[i]);
i++;
} else {
result.push(right[j]);
j++;
}
}
return result.concat(left.slice(i)).concat(right.slice(j));
}
const arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5];
console.log(mergeSort(arr)); // [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
### 回答2:
归并排序是一种常见的排序算法,基于分治策略的思想。下面是用JavaScript实现归并排序的代码:
```
function mergeSort(arr) {
if (arr.length <= 1) {
return arr;
}
const middle = Math.floor(arr.length / 2);
const left = arr.slice(0, middle);
const right = arr.slice(middle);
return merge(mergeSort(left), mergeSort(right));
}
function merge(left, right) {
let result = [];
let lIndex = 0;
let rIndex = 0;
while (lIndex < left.length && rIndex < right.length) {
if (left[lIndex] < right[rIndex]) {
result.push(left[lIndex]);
lIndex++;
} else {
result.push(right[rIndex]);
rIndex++;
}
}
return result.concat(left.slice(lIndex)).concat(right.slice(rIndex));
}
// 测试代码
const arr = [4, 2, 6, 8, 1, 3, 5, 7];
const sortedArr = mergeSort(arr);
console.log(sortedArr);
```
这段代码实现了归并排序的逻辑。`mergeSort`函数是主函数,它先将数组分成两部分,然后通过递归调用`mergeSort`对左右两部分分别进行排序。最后,将左右两部分的排序结果通过`merge`函数合并成一个有序的数组。
`merge`函数接收两个已经排序的数组,在合并的过程中,每次从左右两个数组中选取较小的元素放入结果数组中。最后,将左右数组中剩余的元素依次放入结果数组即可。
例如,在测试代码中,输入数组`[4, 2, 6, 8, 1, 3, 5, 7]`经过归并排序后,输出`[1, 2, 3, 4, 5, 6, 7, 8]`。
### 回答3:
归并排序是一种使用分治思想的排序算法,其基本思想是将原始序列分成两个较小的子序列,然后分别对子序列进行排序,最后将排好序的子序列合并成一个有序序列。
以下是使用JavaScript编写的归并排序示例代码:
```javascript
// 归并排序函数
function mergeSort(arr) {
if (arr.length <= 1) {
return arr; // 基准条件:当数组长度小于等于1时,直接返回数组
}
// 找到中间索引位置
const mid = Math.floor(arr.length / 2);
// 递归分解左右两个子序列
const left = mergeSort(arr.slice(0, mid));
const right = mergeSort(arr.slice(mid));
// 合并两个有序子序列
return merge(left, right);
}
// 合并函数
function merge(left, right) {
const merged = [];
let i = 0;
let j = 0;
// 比较左右两个子序列的元素,将较小的元素加入 merged 数组中
while (i < left.length && j < right.length) {
if (left[i] <= right[j]) {
merged.push(left[i]);
i++;
} else {
merged.push(right[j]);
j++;
}
}
// 将剩余的元素添加到 merged 数组中
while (i < left.length) {
merged.push(left[i]);
i++;
}
while (j < right.length) {
merged.push(right[j]);
j++;
}
return merged;
}
// 测试代码
const arr = [5, 3, 8, 4, 2, 1, 9, 6, 7];
const sortedArr = mergeSort(arr);
console.log(sortedArr);
```
以上代码首先定义了归并排序函数 `mergeSort`,该函数递归地将原始数组分解为较小的子序列,并调用 `merge` 函数将两个有序子序列合并成一个有序序列。
`merge` 函数比较左右两个子序列的元素,将较小的元素依次添加到 `merged` 数组中,最后将剩余的元素添加到 `merged` 数组中。最后,`mergeSort` 函数返回排序好的数组。
通过对测试数组 `[5, 3, 8, 4, 2, 1, 9, 6, 7]` 调用 `mergeSort` 函数,可以得到排序好的数组 `[1, 2, 3, 4, 5, 6, 7, 8, 9]`。
阅读全文