让前端飞

JS实现的排序算法

2018-03-06  本文已影响12人  Viaphlyn
排序总结

一、冒泡排序

冒泡排序

算法描述如下:

function bubbleSort(arr) {
    var len = arr.length;
    for (var i = 0; i < len; i++) {
        for (var j = 0; j < len - 1 - i; j++) {
            if (arr[j] > arr[j+1]) {        //相邻元素两两对比
                var temp = arr[j+1];        //元素交换
                arr[j+1] = arr[j];
                arr[j] = temp;
            }
        }
    }
    return arr;
}
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(bubbleSort(arr));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]

二、快速排序

快速排序

快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:

//方法一、运行时间较快
function quickSort1(arr){
        if(arr.length <=1){
            return arr;
        }
        var pivotIndex = Math.floor(arr.length/2);
        var pivot = arr.splice(pivotIndex,1)[0];//返回数组长度一半的元素作为基准
        var left=[];
        var right=[];
        for(var i=0; i < arr.length; i++){
            if(arr[i]<pivot){ //元素小于基准,push到左边的数组
                left.push(arr[i]);
            }else{
                right.push(arr[i]) //元素大于基准,到右边
            }
        }
        //把左右两边数组以及基准连起来
        return quickSort1(left).concat([pivot], quickSort1(right));
    }
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(quickSort1(arr));
//方法二
function quickSort2(array, left, right) { //left和right分别为数组的开始和结束位置
        if (Object.prototype.toString.call(array).slice(8, -1) === 'Array' 
&& typeof left) {   //判断array是否为数组
            if (left < right) {
                var i = left - 1,
                    temp;
                for (var j = left; j <= right; j++) { 
                    if (array[j] <= array[right]) {
                        i++;
                        temp = array[i];
                        array[i] = array[j];
                        array[j] = temp;
                    }
                }
                quickSort2(array, left, i - 1);
                quickSort2(array, i + 1, right);

            }
            return array;
        } else {
            return 'array is not an Array or left or right is not a number!'
        }
    }
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(quickSort2(arr,0,arr.length-1));

三、选择排序

选择排序

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

算法描述如下:

function selectionSort(arr) {
    var minIndex, temp;
    for (var i = 0; i < arr.length - 1; i++) {
        minIndex = i;
        for (var j = i + 1; j <arr.length; j++) {
            if (arr[j] < arr[minIndex]) {     //寻找最小的数
                minIndex = j;                 //将最小数的索引保存
            }
        }
        temp = arr[i];
        arr[i] = arr[minIndex];
        arr[minIndex] = temp;
    }
    return arr;
}
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(selectionSort(arr));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]

四、插入排序

插入排序

一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:

function insertionSort(array) {
    if (Object.prototype.toString.call(array).slice(8, -1) === 'Array') {
        for (var i = 1; i < array.length; i++) {
            var key = array[i];
            var j = i - 1;
            while (j >= 0 && array[j] > key) {
                array[j + 1] = array[j];
                j--;
            }
            array[j + 1] = key;
        }
        return array;
    } else {
        return 'array is not an Array!';
    }
}

参考资料

上一篇下一篇

猜你喜欢

热点阅读