来来来,看JS排序算法

286 阅读2分钟

各算法时间复杂度

先粗知一下各个算法及其复杂度 ,我们这里所说的排序算法就是数据结构里边的,学过数据结构的肯定知道他们的原理。我们不细说原理,直接讲述下代码.用的时候直接用sort即可

时间复杂度和空间复杂度计算方式不用我说了吧

冒泡排序

这个比较简单,相邻两个数据比较,就是相当于大水泡在一层层上升,所以是冒泡排序

export default (arrays) => {
     for (let i = 0; i < arrays.length - 1 ; i++) {
            //内层循环是当前趟数需要比较的次数
            for (let j = 0; j < arrays.length - i - 1; j++) {
                //前一位与后一位与前一位比较,如果前一位比后一位要大,那么交换
                if (arrays[j] > arrays[j + 1]) {
                    temp = arrays[j];
                    arrays[j] = arrays[j + 1];
                    arrays[j + 1] = temp;
                }
            }
        }
    }

选择排序

选择排序也是两层for循环,就是相当于遍历数组所有元素,取出当前遍历元素的最小值给遍历初始元素,与冒泡排序不同的是,选择排序是遍历获取最小值然后排序,冒泡是在不断的置换相邻元素顺序。

export default (arrays) => {
     for (let i = 0; i < arrays.length; i++) {
            let min = arr[i];
            //内层循环是当前趟数需要比较的次数
            for (let j = i+1; j < arrays.length; j++) {
                //前一位与后一位与前一位比较,如果前一位比后一位要大,那么交换
                if (arrays[j] < min) {
                    let temp = min;
                    min = arrays[j];
                    arrays[j] = temp;
                }
            }
            arr[i]=min;
        }
    return arrays;
    } 

排序延伸

问题:最大间距,即求排序数组相邻元素之间最大的差值。
常规做法思路: 首先通过sort排序,然后遍历求差值,比较即可,这种性能不是最优解,因为重复遍历!
我的算法思路: 在通过冒泡排序和选择排序的每一次遍历时,可以获得一个相邻元素之间的差值,即可以在排序过程中进行差值比较,减少一次遍历过程。
代码

export default (arrays) => {
     if(arrays.length<2){
        return 0;
     }
     for (let i = 0; i < arrays.length - 1 ; i++) {
         //内层循环是当前趟数需要比较的次数
         for (let j = 0; j < arrays.length - i - 1; j++) {
            //前一位与后一位与前一位比较,如果前一位比后一位要大,那么交换
            if (arrays[j] > arrays[j + 1]) {
                temp = arrays[j];
                arrays[j] = arrays[j + 1];
                arrays[j + 1] = temp;
            }
        }
        let temp =math.abs(arrays[length-2-i]-arrays[length-1-i];
        if(temp>max){
            max = temp;
        }
     }
    return max;
    }