js排序算法

本文详细介绍了四种常见的排序算法:选择排序、插入排序、归并排序和快速排序。对比了它们的时间复杂度,并分析了各种排序算法的特点及适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.选择排序

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

选择排序在每个循环时都需比较剩余所有元素,因此效率不高
时间复杂度不管是最坏还是平均都为O(n^2)

2.插入排序

function sortInsert(arr) {
    var sArr = arr.slice(0);
    for (var i = 1; i < sArr.length; i++) {
        var temp = sArr[i];
        for (var j = i; j > 0 && temp < sArr[j - 1]; j--) {
            sArr[j] = sArr[j - 1];
        }
        sArr[j] = temp;
    }
    return sArr;
}

插入排序中,当不符和条件时,退出循环,而不是比较所有剩余元素
当排序的数组中元素接近有序时,插入排序效率较高,时间复杂度接近O(n)
时间复杂度不管是最坏还是平均都为O(n^2)

4.归并排序

var sort_merge = function (arr) {
    if(arr.length < 2) {
        return arr;
    }
    var step,right,left;
    step = 1;
    while(step < arr.length){
        left = 0;
        right = step;
        while(right + step <= arr.length){
            mergeArrays(arr,left,left+step,right,right+step);
            left = right + step;
            right = left + step;
        }
        if(right < arr.length){
            mergeArrays(arr,left,left+step,right,arr.length);
        }
        step *= 2;
    }
    return arr;
};
var mergeArrays = function (arr,startLeft,stopLeft,startRight,stopRight) {
    var rightArr = new Array(stopRight - startRight);
    var leftArr = new Array(stopLeft - startLeft);
    var k = startLeft,m,n;
    m = n = 0;
    for(var i = 0;i < leftArr.length; i++){
        leftArr[i] = arr[k++];
    }
    k = startRight;
    for(var j = 0;j < rightArr.length; j++){
        rightArr[j] = arr[k++];
    }
    while(m < leftArr.length && n < rightArr.length){
        if(leftArr[m] <= rightArr[n]){
            arr[startLeft++] = leftArr[m++];
        }else{
            arr[startLeft++] = rightArr[n++];
        }
    }
    if(m < leftArr.length){
        for(var t = m; t<leftArr.length; t++){
            arr[startLeft++] = leftArr[t];
        }
    }else if(n < rightArr.length){
        for(var t1 = n; t1<rightArr.length; t1++){
            arr[startLeft++] = rightArr[t1];
        }
    }
};

归并排序也是进行递归,时间复杂度均为O(nlogn)
优化:若两组待归并的数组A和B,A 的最后一个元素小于B的第一个元素时,则不需要归并,因为已经是排好序的。

4.快速排序

var sort_quik = function (arr,left,right) {
    if(left < right){
        var pos = change_quik(arr,left,right);
        sort_quik(arr,left,pos);
        sort_quik(arr,pos+1,right);
    }
    return arr;
};
var change_quik = function (arr,left,right) {
    var pos = left;
    var temp = arr[left];
    for(var i = left+1 ;i < right; i++){
        if(arr[i]<temp){
            pos++;
            swap(arr,pos,i);
        }
    }
    arr[left] = arr[pos];
    arr[pos] = temp;
    return pos;
};
  • 快速排序,若数组是随机的,平均时间复杂度为O(nlogn),因为递归树的高度为nlogn
  • 当数组接近有序且以第一个数为基准时,递归树的高度接近n,因此,最坏情况下快速排序时间复杂度为n^2
  • 可随机取一个数为基准进行排序,第一此取到最小数的概率为1/n,第二次为1/(n-1);当n越大时,每次取到最小数的概率几乎为0,因此快排的时间复杂度为n^2的几率很低
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值