js数组中的各种排序方法

冒泡排序

思路:重复遍历数组中的元素,依次比较两个相邻的元素,如果前一个元素大于后一个元素,就依靠第三个变量将它们换过来,直到所有元素遍历完。

function bubbleSort(arr){

          for(let i = 0; i < arr.length - 1; i ++){

                for(let j = 0; j < arr.length - 1 - i; j ++){

                      if(arr[j] > arr[j+1]){   

                            let tem = arr[j];

                            arr[j] = arr[j+1];

                            arr[j+1] = tem;

                      }

                }

          }

          console.log(arr);

    }

    bubbleSort([2,5,6,1,2,9,4,6,3]);    // output:[1, 2, 2, 3, 4, 5, 6, 6, 9]

选择排序

思路:每一次从数组中选出最小的一个元素,存放在数组的起始位置,然后,再从剩余未排序的数组中继续寻找最小元素,然后放到已排序序列的末尾。直到全部数据元素排完。

function selectSort(arr){

          let min = 0; // 用来保存数组中最小的数的索引值

          for(let i = 0; i < arr.length - 1; i ++){

                min = i;

                for(let j = i + 1; j < arr.length; j ++){

                      if(arr[j] < arr[min]){

                            min = j;

                      }

                }

              if(min != i){

                      swap(arr,i,min);

                }

          }

          console.log(arr);

    };

    function swap(arr,index1,index2){ 

    let tem = arr[index1];

          arr[index1] = arr[index2];

          arr[index2] = tem;

    }

    selectSort([7,5,1,2,6,4,8,3,2]);    // output: [1, 2, 2, 3, 4, 5, 6, 7, 8]

插入排序

插入算法的工作原理就是对已排序数据序列从后向前扫描,将未排序数据找到对应的位置并插入。

思路:
(1)从第一个元素开始,该元素可以被认为已经被排序了;
(2)取出下一个元素,在已经排好序的序列中从后往前扫描;
(3)直到找到小于或等于该元素的位置;
(4)将该位置后面的所有已排序的元素从后往前依次向后移一位;
(5)将该元素插入到该位置;
(6)重复步骤 2-5;

function insertSort(arr){

          for(let i = 1; i < arr.length; i ++){

                let j = i,            key = arr[j];

                while( --j > -1 ){

                      if(arr[j] > key){

                        arr[j + 1] = arr[j];

                      } else {

                            break;

                      }

                }

                arr[j + 1] = key;

          }

          console.log(arr);

    }

    insertSort([12,25,41,2,3,15]); // output:[2, 3, 12, 15, 25, 41]

快速排序

对冒泡排序的一种改进。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都比另一部分的所有数据小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

思路:
(1)找基准(一般以中间项为基准)
(2)遍历数组,小于基准的放在 left,大于基准的放在 right
(3)递归

function quickSort(arr){

    if(arr.length<=1){return arr;}    //如果数组<=1,则直接返回

    let pivotIndex = Math.floor(arr.length/2);   

    let pivot = arr.splice(pivotIndex,1)[0]; //找基准,并把基准从原数组删除

    let left=[], right=[];    //定义左右数组

    for(let i=0; i<arr.length; i++){        //比基准小的放在left,比基准大的放在right

        if(arr[i] <= pivot){

            left.push(arr[i]);   

        } else { 

        right.push(arr[i]);

        }

    }

    return quickSort(left).concat([pivot],quickSort(right));    //递归

}

console.log(quickSort([5,3,4,8,6,9,12]));  // output:[3, 4, 5, 6, 8, 9, 12]
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值