js 排序

2021-06-08  本文已影响0人  愤怒的阿昆达
1.快速排序1(纯数字数组)
// 快速排序1(纯数字数组)
function devide(array, start, end) {
    if(start >= end) return array;
    var baseIndex = Math.floor((start + end) / 2), // 基数索引
         i = start,
         j = end;

    while (i <= j) {
        while (array[i] < array[baseIndex]) {
            i++;
        }
        while (array[j] > array[baseIndex])  {
            j--;
        }

        if(i <= j) {
            var temp = array[i];
            array[i] = array[j];
            array[j] = temp;
            i++;
            j--;
        }
    }
    return i;
}

function quickSort(array, start, end) {
    if(array.length < 1) {
        return array;
    }
    var index = devide(array, start, end);
    if(start < index -1) {
        quickSort(array, start, index - 1);
    }
    if(end > index) {
        quickSort(array, index, end);
    }

    return array;
};

var arr = [12,2.5,22,.5,6,8,10];
console.log('排序前:',arr);

var sorted = quickSort(arr, 0, arr.length-1);
console.log('排序后:',sorted);
image.png
2.快速排序2(对象数组)
// 快速排序2(对象数组)
function devide(array, start, end, item) {
    if(start >= end) return array;
    var baseIndex = Math.floor((start + end) / 2), // 基数索引
         i = start,
         j = end;

    while (i <= j) {
        while (array[i][item] < array[baseIndex][item]) {
            i++;
        }
        while (array[j][item] > array[baseIndex][item])  {
            j--;
        }

        if(i <= j) {
            var temp = array[i][item];
            array[i][item] = array[j][item];
            array[j][item] = temp;
            i++;
            j--;
        }
    }
    return i;
}

function quickSort(array, start, end, item) {
    if(array.length < 1) {
        return array;
    }
    var index = devide(array, start, end, item);
    if(start < index -1) {
        quickSort(array, start, index - 1, item);
    }
    if(end > index) {
        quickSort(array, index, end, item);
    }

    return array;
}

var arr = [{v:25},{v:3},{v:12},{v:2.5},{v:12.5},{v:5}];
var arrDeepCopy = JSON.parse(JSON.stringify(arr));// 深拷贝
console.log('排序前:',arrDeepCopy);

quickSort(arr, 0, arr.length-1, 'v');
console.log('排序后:',arr);
image.png

注意:这地方有个坑,只会调换排序的属性,其他属性不变。比如:

现在有三个人对象,对象属性包括姓名、年龄,现在需要安装年龄进行排序。
var arr = [{age:15,name:'张三'},{age:17,name:'王五'},{age:14,name:'李四'}];
按照age,quickSort 排序后结果为:
arr = [{age:14,name:'张三'},{age:15,name:'王五'},{age:17,name:'李四'}];
显然不是我们想要的结果。

我们想要的是:
arr = [{age:14,name:'李四'},{age:15,name:'张三'},{age:17,name:'王五'}];
下面介绍另一中排序:
/**
 * 按对象属性排序
 * @param arr 对象数组
 * @param attribute 需要排序的属性
 * @returns {*}
 */
export function sortedByAttribute(arr, attribute){
    if(arr == null || arr == undefined || arr.length == 0){
        return arr;
    }
    if(typeof arr[0][attribute] == "string"){// 字符排序:正序
        arr.sort(function (a,b) {
            return a[attribute].localeCompare(b[attribute]);
        });
    }else if(typeof arr[0][attribute] == "number"){// 数字排序:正序
        arr.sort(function (a,b) {
            return a[attribute] - b[attribute];
        });
    }
    return arr;
}
上一篇下一篇

猜你喜欢

热点阅读