常见排序算法的JavaScript实现与复杂度分析

本文详细介绍了四种基本排序算法:冒泡排序、选择排序、插入排序,以及两种高效的排序算法:快速排序和归并排序。每种算法都配以原理说明和代码实现,复杂度分析表明,冒泡、选择和插入排序的时间复杂度为O(n²),而快速排序和归并排序则更为高效,分别为O(nlogn)。这些排序算法是计算机科学的基础,对于理解和优化数据处理至关重要。
摘要由CSDN通过智能技术生成

冒泡排序

原理:两两比较,大的往后排

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

复杂度分析:两轮循环,故复杂度为O(n²)

选择排序

原理:选择出未排序元素中最大的,并存放在未排序元素的尾部

    function selectSort(arr){
      let length= arr.length
      for(let i = 0;i<length;i++){
		//最大值的索引
        let maxIndex=i
        for(let j = i+1;j<length;j++){
          if(arr[maxIndex]>arr[j]){
          	//当出现比max更大的值时,更新maxIndex
            maxIndex=j
          }
        }
        //交换最大值与最后一个未排序元素的位置
        [arr[i],arr[maxIndex]]=[arr[maxIndex],arr[i]]
      }
      return arr
    }

复杂度分析:两轮循环,故复杂度为O(n²)

插入排序

原理:每轮选出一个元素,将它放置在合适的位置上(即小值都在它的右边,大值都在它的左边)

    function insertionSort(arr){
      let length=arr.length
      for(let i = 0; i<length;i++){
        //保存当前值
        let current = arr[i]
        //上一个索引
        let preIndex=i-1
        //上一个值比当前值更小时交换顺序(大值左移)循环结束后最大值在最左边
        while(preIndex>=0&&arr[preIndex]<current){
          //小值右移,大值左移
          arr[preIndex+1]=arr[preIndex]
          //继续将该大值与左一位比较
          preIndex--
        }
        //循环结束后current值丢失,赋值回来(相当于右移一位)
        arr[preIndex+1]=current
      }
      return arr
    }

复杂度分析:两轮循环,故复杂度为O(n²)

快速排序

原理:递归,小值放左边,大值放右边

    function quickSort(arr){
      if(arr.length<=1) return arr
      let midIndex = Math.floor(arr.length/2)
      let mid = arr.splice(midIndex,1)
      let left=[]
      let right=[]
      for(let i = 0;i<arr.length;i++){
        if(arr[i]<mid){
          left.push(arr[i])
        }else if (arr[i]>mid){
          right.push(arr[i])
        }
      }
      return quickSort(left).concat(mid,quickSort(right))
    }

复杂度分析:O(nlogn)

归并排序

原理:分治

function mergeSort(arr){
      if(arr.length<=1) return arr
      let midIndex=Math.floor(arr.length/2)
        let left=arr.slice(0,midIndex)
        let right=arr.slice(midIndex)
        return merge(mergeSort(left),mergeSort(right))
      function merge(left,right){
        let result = []
        while(left.length&&right.length){
          if(left[0]>right[0]){
            result.push(right.shift())
          }else{
            result.push(left.shift())
          }
        }
        while(left.length){
          result.push(left.shift())
        }
        while(right.length){
          result.push(right.shift())
        }
        return result
      }
    }

复杂度分析:O(nlogn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值