排序算法JS实现

手撕代码必须会的东西。。。结果希尔排序没写出来,太尴尬了。
1.快速排序
取一个中间的基准值,小的值放在左边的数组,大的值放在右边的数组,最后递归并拼接数组。

function quickSort(arr){
    if(arr.length<=1){
        return arr;
    }
    var baseIndex = Math.floor(arr.length / 2);   //获取基准点位置
    var base = arr.splice(baseIndex, 1)[0];       //获取基准点索引
    var left = [];
    var right = [];
    for(var i = 0; i < arr.length; i++){
        if(arr[i] < base){
            left.push(arr[i]);
        }else {
            right.push(arr[i]);
        }
    }
    return quickSort(left).concat([base], quickSort(right));
}

2.冒泡排序
相邻元素比较,找出最小值冒泡到首位,不断循环完成排序。

function bubbleSort(arr){
    for(var i = 0; i < arr.length; i++){
        for(var j = 0; j < arr.length-i-1; j++){
            if(arr[j] > arr[j+1]){   //相邻元素比较
                [arr[j], arr[j+1]] = [arr[j+1], arr[j]];
            }
        }
    }
    return arr;
}

3.选择排序
循环找出最小元素与首位元素交换次序直到最大元素。

function selectSort(arr) {
    for(var i = 0; i < arr.length; i++){
        for(var j = i + 1; j < arr. length; j++){
            if(arr[i] > arr[j]){
                [arr[i], arr[j]] = [arr[j], arr[i]];
            }
        }
    }
    return arr;
}

4.插入排序
以第一个元素为有序数组,其后的元素在该数组中找到合适的位置插入。

function insertSort(arr) {
    var len = arr.length;
    for(var i = 1; i < len; i++){
        var temp = arr[i];
        var j = i - 1;
        while(arr[j] > temp){
            arr[j+1] = arr[j];
            j--;
        }
        arr[j+1] = temp;
    }
    return arr;
}

5.希尔排序
按一定的间隔对数列进行分组,然后在每一个分组中做插入排序;随后逐次缩小间隔,在每一个分组中做插入排序,直到间隔等于1,做一次插入排序后结束。

function shellSort(arr) {
    var len = arr.length;
    var h = 1;
    while (h < len / 3) {
        h = 3 * h + 1; //设置间隔
    }
    while (h >= 1) {
        for (var i = h; i < len; i++) {
            for (j = i; j >= h && arr[j] < arr[j - h]; j -= h) {
                swap(arr, j, j - h);
            }
        }
        h = (h - 1) / 3;
    }
}
function swap(array, i, j) { //两个数调换
    var temp = array[j];
    array[j] = array[i];
    array[i] = temp;
}

6.归并排序
采用分治思想,将数组反复二分为两个小数组,直到每个数组只有一个元素,从最小的数组开始,两两顺序合并。

function mergeSort(arr) {
    var len = arr.length;
    if(len < 2) return arr;
    var mid = Math.floor(len / 2),
        left = arr.slice(0, mid),
        right = arr.slice(mid);
    return merge(mergeSort(left), mergeSort(right));    
}
function merge(left, right) {
    var res = [];
    while(left.length > 0 && right.length > 0){
        if(left[0] <= right[0]){
            res.push(left.shift());
        }else{
            res.push(right.shift());
        }
    }
    while(left.length)
        res.push(left.shift());
    while(right.length)
        res.push(right.shift());
        
    return res;        
}

7.计数排序
使用一个额外的计数数组bucket,其中第 i 个元素是待排序数组 arr 中值等于 i 的元素的个数。然后根据数组 bucket 来将 arr 中的元素排到正确的位置。

function countingSort(arr, max) {
    var bucket = new Array(max+1),
        index = 0;
    var len = arr.length,
        bucketLen = max + 1;
        
    for (var i = 0; i < len; i++) {
        if (!bucket[arr[i]]) {  //若计数缓存中无此数,则置0
            bucket[arr[i]] = 0;
        }
        bucket[arr[i]]++;
    }
    
    for (var j = 0; j < bucketLen; j++) {
        while(bucket[j] > 0) {  //找到计数缓存中非0的项放在原数组中
            arr[index++] = j;
            bucket[j]--;
        }
    }
    return arr;
}

你可能感兴趣的:(自我总结)