js数组中常见的几大排序

一、冒泡排序

  • 原理:两两比较相邻的元素,如果反序,则交换位置,直到没有反序为止。
  • a、将序列中的相邻元素依次比较,较小的数向下冒(即交换到前面);第一轮比较结束后,序列第一个元素是当前序列的最小值。
  • b、对序列当中剩下的n-1个元素再次执行步骤a,直至完成。共需要n-1轮比较。
   var arr = [1,9,4,2,5,3,8,6,7];
   function bubbleSort(array){
       if(Array.isArray(array)){//判断是否为数组
           if(array.length == 1){//若数组只有1位,不用排序,直接返回
               return array;
           }
           var temp = null;
           //遍历进行比较
           for(var i = 0;i<array.length;i++){
               for(var j = 0;j<array.length-i-1;j++){
                   if(array[j]>array[j+1]){//从小到大排序
                       temp = array[j];
                       array[j] = array[j+1];
                       array[j+1] = temp;
                   }
               }
           }
           return array;
       }
   }
   console.log(bubbleSort(arr));//[1, 2, 3, 4, 5, 6, 7, 8, 9]

二、快速排序(递归排序)

  • 原理:在数据集中,找一个基准点,建立两个数组,分别储存左边和右边的数组,利用递归进行下次比较。
  • 即取中间值放到一边,把原数组一分为二,左边一个数组,右边一个数组,然后把两个数组中的值分别和中间的那个值进行比较,比它小的放在左边的数组中,比它大的放在右边的数组中,然后一直递归,直到数组不能分割。
  • 递归必须有一个出口,所以最后要让他返回数组。
	var arrinfo = [1,9,4,2,5,3,8,6,7,1,3,5];
	function quickSort(array){
       if(Array.isArray(array)){
           if(array.length<=1){
               return array;
           }
           var centerIndex = Math.ceil(array.length/2);
           var cValue = array.splice(centerIndex,1);
           var left = [];
           var right = [];
           //开始对剩余的值比较,左右添加
           array.forEach(function(value){
               if(value<cValue){
                   left.push(value);
               }
               else{
                   right.push(value);
               }
           });
           //递归
           return quickSort(left).concat(cValue,quickSort(right));
       }
   }
   console.log(quickSort(arrinfo));//[1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 8, 9]

三、选择排序

  • 原理:遍历数组,设置最小值的索引为0,如果取出的值比当前最小值小,就替换最小值索引,遍历完成后,将第一个元素和最小值索引上的值交换,如上操作后,第一个元素就是数组中的最小值,下次遍历就可以从索引1开始重复上述操作。
	var arrinfo = [1,9,4,2,5,3,8,6,7];
	function selectSort(array){
       if(Array.isArray(array)){
           if(array.length == 1){
               return array;
           }
           for(var i = 0;i<array.length-1;i++){
               var minIndex = i;//默认当前的i最小
               for(var j = i+1;j<array.length;j++)
               {
                   minIndex = array[minIndex]>array[j]?j:minIndex;
               }
               //交换位置
               [array[i],array[minIndex]] = [array[minIndex],array[i]];
           }
           return array;
       }
   }
   console.log(selectSort(arrinfo));//[1, 2, 3, 4, 5, 6, 7, 8, 9]

四、插入排序

  • 原理:第一个元素默认是已排序元素,取出下一个元素和当前元素比较,如果当前元素大就交换位置,那么此时第一个元素就是当前的最小数,所以下次从第三个元素开始,向前比对,重复之前的操作。
	var arrdata = [1,9,4,2,5,3,8,6,7];
	function insertSort(arr){
       if(Array.isArray(arr)){
           if(arr.length == 1){
               return arr;
           }
           for(var i = 1;i<arr.length;i++)
           {
               //取前面的索引
               var preIndex=i-1;
               var current = arr[i];//当前值
               while(preIndex>=0&&arr[preIndex]>current)
               {
                   arr[preIndex+1] = arr[preIndex];
                   preIndex--;
               }
               arr[preIndex+1] = current;
           }
           return arr;
       }
   }
   console.log(insertSort(arrdata));//[1, 2, 3, 4, 5, 6, 7, 8, 9]
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
JavaScript数组常见的方法有很多,以下是一些常用的方法: 1. push():向数组末尾添加一个或多个元素,并返回新的长度。 2. pop():删除并返回数组的最后一个元素。 3. shift():删除并返回数组的第一个元素。 4. unshift():向数组开头添加一个或多个元素,并返回新的长度。 5. concat():合并两个或多个数组,返回一个新数组。 6. slice():从原数组中提取指定位置的元素,返回一个新数组。 7. splice():删除、替换或插入元素到原数组中的指定位置。 8. indexOf():返回指定元素数组中首次出现的索引,如果不存在则返回-1。 9. lastIndexOf():返回指定元素数组中最后一次出现的索引,如果不存在则返回-1。 10. includes():判断数组是否包含指定元素,返回布尔值。 11. join():将数组中所有元素以指定分隔符连接成一个字符串。 12. reverse():颠倒数组中元素顺序。 13. sort():对数组进行排序,默认按照Unicode码点排序。 14. filter():创建一个新数组,包含所有通过指定函数检查的元素。 15. map():创建一个新数组,包含对原数组中每个元素进行处理后的结果。 16. reduce():对数组中的所有元素进行累加或累计操作,返回一个值。 17. forEach():对数组中的每个元素执行指定操作,没有返回值。 这只是一小部分常见数组方法,JavaScript提供了很多其他有用的数组方法,可以根据具体需求选择使用
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南初️

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值