js实现冒泡排序、插入排序、选择排序、快速排序(升序)

生成1-100的随机数:

        function getArr() {
            var arr = [];
            for (var i = 0; i < 10; i++) {
                arr.push(Math.floor(Math.random() * (99) + 1));
            }
            return arr;
        }

冒泡排序,大致思路就是找出最大的值冒泡到后面去,最大的冒泡到最后一位,第二大的冒泡到倒数第二位这样,从第一个数开始向后面冒泡,遇到比它大的数就交换位置(比如第一个数的值大于第二个数的值,那么第一个数就和第二个数交换位置),这样一直冒泡下来,经过第一遍冒泡,最后一位数就是最大的.....

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

        var arr = getArr();
        console.log(bubble(arr));

选择排序:大致思路就是先找出最小的值,然后和第一个数交换位置,然后找出第二小的值,然后和第二个数交换位置....

       function selectSort(arr) {
            var len = arr.length;
            var min, item;
            for (var i = 0; i < len; i++) {
                min = i;
                for (var j = i + 1; j < len; j++) {
                    if (arr[j] < arr[min])
                        min = j;
                }
                temp = arr[i];
                arr[i] = arr[min];
                arr[min] = temp;
            }
            return arr;
        }

        arr = getArr();
        console.log(selectSort(arr));

插入排序:

function insertionSort(arr) {
    var len = arr.length;
    var preIndex, current;
    for (var i = 1; i < len; i++) {
        preIndex = i - 1;
        current = arr[i];
        while(preIndex >= 0 && arr[preIndex] > current) {
            arr[preIndex+1] = arr[preIndex];
            preIndex--;
        }
        arr[preIndex+1] = current;
    }
    return arr;
}

arr = getArr();
console.log(selectSort(arr));

快速排序

快速实现简单版:

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

快速实现复杂版: 

        function quickSort(arr, left=0, right=arr.length-1) {
            var partitionIndex;
 
            if (left < right) {
                partitionIndex = partition(arr, left, right);
                quickSort(arr, left, partitionIndex - 1);
                quickSort(arr, partitionIndex + 1, right);
            }
            return arr;
        }
 
        function partition(arr, left, right) {//找到基准位置
            let index = left + 1;
            for (var i = index; i <= right; i++) {
         //通过swap,可以保证把小于pivot的数字保持放到index左边,大于的放右边
                if (arr[i] < arr[left]) {
                    swap(arr, i, index);
                    index++;
                }
            }
            swap(arr, left, index - 1);
            return index - 1;
        }
 
        function swap(arr, i, j) {
            var item = arr[i];
            arr[i] = arr[j];
            arr[j] = item;
        }
        arr = getArr();
        console.log(quickSort(arr, 0, 9));

假设arr=[4,1,3,6,2],left=0,right=4

那么第一次partition,变化过程为:

povit=0,

index=1,i=1,arr=[4,1,3,6,2],

index=2,i=2,arr=[4,1,3,6,2],

index=3,i=3,arr=[4,1,3,6,2],

index=3,i=4,arrr=[4,1,3,2,6],

index=4,i=5(出for循环),

然后arrr=[2,1,3,4,6],返回3

那么数组前一部分[2,1,3](0,2)通过第二次partition,变化为:

povit=0,

index=1,i=1,arr=[2,1,3],

index=2,i=2,arr=[2,1,3],

index=2,i=3(出for循环),

然后arr=[1,2,3],返回1

那么[2](4,4)通过第三次partition,变化为:

povit=4,index=5,i=5...

纵观partition的运行过程,如果arr=[4,1,3,6,2],那么就是[4,1,3,2,6]--》[2,1,3,4,6],要是数组再多几个数,

如果arr=[4,1,3,2,6,7,8,1],那么就是[4,1,3,2,6,7,8,1]--》[4,1,3,2,1,7,8,6]--》[1,1,3,2,4,7,8,6]

index记录的永远是最后一个小于基准的数所在位置+1(比如上例就是6所在位置),当遇到有比基准小的数时(上例为1),数组就把该数和比基准大的数交换位置(1和6交换),然后index+1

所以partition做的事情就是以第一个数为基准,从第二个数开始,把比它小的数向前排在一起,比它大的数向后排在一起(比如第一次partition的变化过程就是[4,1,3,6,2]---》[4,1,3,6,2]---》4,1,3,6,2]---》[4,1,3,2,6]),然后找到最后一个小于它的数所在位置(2所在位置),然后把它和最后一个小于它的数进行交换([4,1,3,2,6]---》[2,1,3,4,6]),这样一来,左边就是小于基准的数,右边就是大于基准的数,然后再把比它小的数进行排序,比它大的数进行排序......

参考文档:

JS的十大经典算法排序

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值