javascript快速、冒泡、插入排序

在一个技术群看到一人侃大山的时候,说了关于前端技术环境与实际工作环境的博弈中,如果一个连快速排序与冒泡排序都写不出的技术也没有什么好挑工作环境了。自己平常处理大量数据的情况较少,也不怎么使用排序,因此准备尝试下,看自己手写的怎么样。

又去仔细理解了下快速排序与冒泡排序的定义后,自己无参考别人代码写的:

快速排序:数组中随机挑选一个元素作为标尺,比之大的放到该元素后面,比之小的放到该元素前面,如此重复直至全部正序排练。

冒泡排序:数组中的元素前后比较,小的移前大的移后,如此重复直至正序排列。

//快速排序
var quickSortFunc = function func (arr) {

    if (!arr instanceof Array) {
        throw '这不是一个数组';
    }

    var referenceIndex = Math.floor(arr.length / 2),  //参考元素的索引
        reference = arr[referenceIndex], //参考元素
        lessArr = [], //小于参考数值的元素存放数组
        moreArr = []; //大于参考数值的元素存放数组

    for (var i = 0; i < arr.length; i++) {
        if (arr[i] < reference) {
            lessArr.push(arr[i]);
            lessArr = func(lessArr); //增加一个元素时候 重新进行快速排序
        }
        if (arr[i] > reference) {
            moreArr.push(arr[i]);
            moreArr = func(moreArr);
        }
    }
    return lessArr.concat([reference], moreArr); 

}


//冒泡排序
var bubbleSortFunc = function func (arr) {

    if (!arr instanceof Array) {
        throw '这不是一个数组';
    }

    for (var i = 1; i < arr.length; i++) {
        if (arr[i - 1] > arr[i]) {  //前面元素比后面的元素大
            var less = arr[i],
                more = arr[i - 1];
            arr.splice(i - 1, 2, less, more);
            arr = func(arr);   //进行冒泡排序后一次则重新冒泡排序
        }
    }
    return arr;
}

两种排序方式中并未去除数组长度为0的情况,因为长度为0的话返回为一个空数组。

快速排序中采用了两个if判断,并未使用一个if else,因为if else并不能排除元素重复的情况。、

冒泡排序并未排除元素重复的情况。

插入排序:从原数组冲取出一个元素插入一个有序列表中。

//插入排序
// var insertSortFunc = function func (arr) {

//     if (!arr instanceof Array) {
//         throw '这不是一个数组';
//     }

//     var newArrr = [];
//     for (var i = 0; i < arr.length; i++) {
//         var flag = newArrr.length - 1;
//         for (var k = 0; k < newArrr.length; k ++) {

//             if (arr[i] > newArrr[k]) {
//                 flag = k
//                 break;
//             }

//         }
//         newArrr.splice(flag, 0, arr[i]);
//     }

//     return newArrr;

// }
var insertSortFunc = function func (arr) {

    if (!arr instanceof Array) {
        throw '这不是一个数组';
    }


    for (var i = 1; i < arr.length; i++) {
        var ele= arr[i],index = undefined;
        for (var k = i - 1; k > -1; k--) {
            if (ele < arr[k]) {
                index = k;
            }
        }
        if (index) {
            arr.splice(i, 1);
            arr.splice(index, 0, ele);        
        }
    }

    return arr;

}

自己实现了一种原数组操作(原地排序)。

Written on July 12, 2015