老师,归并排序我用另外一种写法性能慢了100倍,麻烦帮我看看为什么?

来源:11-5 JavaScript 实现:归并排序

慕九州3950989

2021-09-09

我的写法:

 export default class mergeSort {
    public static sort(arr: number[]) {
        this.mergeSort(arr, 0, arr.length - 1)
    }
    private static mergeSort(arr: number[], l: number, r: number) {
        if (l >= r) {
            return;
        }
        let min = Math.floor((r - l) / 2 + l);
        this.mergeSort(arr, l, min);
        this.mergeSort(arr, min + 1, r);
        this.merge(arr, l, min, r)
    }
    private static merge(arr: number[], l: number, min: number, r: number) {
        let tmp = []
        for (let i = 0; i < arr.length; i++) {
            tmp[i] = arr[i]
        }
        let i = l;
        let j = min + 1;
        for (let k = l; k <= r; k++) {
            if (i > min) {
                arr[k] = tmp[j];
                j++
            } else if (j > r) {
                arr[k] = tmp[i]
                i++
            } else if (tmp[i] <= tmp[j]) {
                arr[k] = tmp[i];
                i++
            } else {
                arr[k] = tmp[j];
                j++
            }
        }
    }
 }

数据规模50000的随机数据实测结果:
希尔排序:
shellSort Data scale:50000 Time consuming:0.012 S
快速排序:
quickSort Data scale:50000 Time consuming:0.011 S
我上面代码的归并排序:
mergeSort Data scale:50000 Time consuming:20.523 S
您课上讲的归并排序:
mergeSort2 Data scale:50000 Time consuming:0.017 S

写回答

1回答

lewis

2021-09-09

自己尝试写归并算法,值得肯定。至于你写的这个算法速度为什么慢,我建议你先用一个小型的测试数据测一下,然后打断点看一下整个逻辑跟课程上讲的算法有什么区别。另外也要关注一下空间复杂度,看看有没有内存溢出。

0
2
慕九州3950989
老师这个问题找到原因了,主要是merge里的这个循环太耗时了 private static merge(arr: number[], l: number, min: number, r: number) { let tmp = [] for (let i = 0; i < arr.length; i++) { tmp[i] = arr[i] }。。。。。。。 优化后500万随机数据只需要1秒左右 shellSort Data scale:5000000 Time consuming:1.131 S quickSort Data scale:5000000 Time consuming:0.548 S mergeSort Data scale:5000000 Time consuming:1.04 S
2021-09-10
共2条回复

JavaScript版数据结构与算法 轻松解决前端算法面试

夯实算法基础,填补技术短板,助力面试考题最后一公里

2479 学习 · 683 问题

查看课程