JavaScript实现常见简单排序算法

JavaScript实现常见简单排序算法(冒泡排序,快速排序,直接插入排序,选择排序)

冒泡排序

排序思想
  • 数组相邻两项进行比较,如果前一项比后一项大则交换位置,比较arr.length-1轮,每一轮把最大的一项放最后。
  • 对除了最后一项之外的其它项重复第一步,直到只剩一项。
动图演示

在这里插入图片描述

时间复杂度及空间复杂度

最好情况下时间复杂度:O(n)
最坏情况下时间复杂度:O(n²)
平均时间复杂度:O(n²)
空间复杂度:O(1)

具体代码实现
       function bubbleSort(arr){
            //控制共比较多少轮
            for(var i = 0;i<arr.length-1;i++){
                //控制比较次数,每一轮最后一个不用比较
                for(var j = 0;j<arr.length-1-i;j++){
                    if(arr[j]>arr[j+1]){//按从小到大的顺序排序
                        var temp = arr[j];//借助第三方变量交换位置
                        arr[j]=arr[j+1];
                        arr[j+1]=temp;
                    }
                }             
            }
            return arr;
        }
        console.log(bubbleSort([4,6,2,8,3,0,1,9,7,5]));

快速排序

排序思想
  • 以一个数为基准(中间的数),比基准小的放到左边,比基准大的放到右边。
  • 再按此方法对这两部分数据分别进行快速排序(递归进行)。
  • 不能再分后退出递归,并重新将数组合并。
动图演示

在这里插入图片描述

时间复杂度及空间复杂度

最好情况下时间复杂度:O(n log n)
最坏情况下时间复杂度:O(n²)
平均时间复杂度:O(n log n)
空间复杂度:O(log n)

具体代码实现
      function quickSort(arr) {
            //递归结束判断条件,当被分的数组只剩下一个时,退出递归
            if (arr.length <= 1) {
                return arr;
            } else {
                var index = Math.floor(arr.length / 2);//取最中间的那个元素
                var mid = arr.splice(index, 1);//中间的那个值即为基准值
                var left = [];
                var right = [];
                //比基准值小的放左边,比基准值大的放右边
                for (var i = 0; i < arr.length; i++) {//循环遍历数组
                    if (arr[i] < mid) {
                        left.push(arr[i]);
                    } else {
                        right.push(arr[i]);
                    }
                }
                //递归,然后把数组合并到一起
                //debugger
                return quickSort(left).concat(mid, quickSort(right));
            }

        }
        console.log(quickSort([4,6,2,8,3,0,1,9,7,5]));

直接插入排序

排序思想
  • 把数组分为[已排序]和[未排序]两部分,第一个数为[已排序],其余为[未排序]。
  • 再从[未排序]抽出第一个数,和[已排序]部分比较,插入到合适的位置。
动图演示

在这里插入图片描述

时间复杂度及空间复杂度

最好情况下时间复杂度:O(n)
最坏情况下时间复杂度:O(n²)
平均时间复杂度:O(n²)
空间复杂度:O(1)

具体代码实现
      function insertSort(arr){     
            for(var i = 1;i < arr.length; i++){//遍历所有的数字
                if(arr[i]<arr[i-1]){ //如果当前数字比前一个数字小
                    var temp = arr[i];//把当前遍历的数字存起来
                    var j;
                    //遍历当前数字前面所有的数字,并且当前数字小于前面的数字时
                    for(j = i-1;j >= 0 && temp < arr[j];j--){
                        arr[j+1] = arr[j];//把前一个数字给后一个数字,位置变换
                    }
                    //把临时变量(外出for循环的当前元素)赋给不满足条件的后一个元素
                    arr[j+1] = temp;
                }
            }
            return arr;
        }
        console.log(insertSort([4,6,2,8,3,0,1,9,7,5]));

选择排序

排序思想
  • 找出最小的数,和第一个交换位置。
  • 在剩下的数中,找出最二小的数,放在第二个。
  • 依次类推,排出顺序。
动图演示

在这里插入图片描述

时间复杂度及空间复杂度

最好情况下时间复杂度:O(n²)
最坏情况下时间复杂度:O(n²)
平均时间复杂度:O(n²)
空间复杂度:O(1)

具体代码实现
        function selectSort(arr){
            var min;
            //遍历当前数组
            for(var i = 0;i < arr.length;i++){
                //将当前值设置为最小值
                min = i;
                //遍历当前数组其余位置是否还有比min更小的值
                for(var j = i+1;j < arr.length;j++){
                    //存在比min更小的值,则把更小的值赋值给min
                    if(arr[j] < arr[min]){
                        min = j;
                    }
                }
                //如果当前位置不是最小值,将其换为最小值
                if(i != min){
                    var temp = arr[i];
                    arr[i] = arr[min];
                    arr[min] = temp;
                }
            }
            return arr;
        }
        console.log(selectSort([4,6,2,8,3,0,1,9,7,5]));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值