js实现冒泡排序,快速排序,选择排序

用js冒泡排序,快速排序,选择排序

1.冒泡排序

冒泡排序是比较经典的排序方法,是一种用时间换空间的排序方法。我总结了一下它的特点:(1)它的时间复杂度是;(2)每一趟相邻元素两两比较完毕就会产生最值(最大值);(3)每次比较完后下一趟就会少一个元素参与比较(即该趟比较的最大值)。
// 冒泡排序

    function maopao(arr){
        for(var i=0;i<arr.length-1;i++){
            for(var j=i+1;j<arr.length;j++){
                // 如果前面的大,交换位置
                var temp=[];
                if(arr[i]>arr[j]){
                    temp = arr[i];
                    arr[i]=arr[j];
                    arr[j]=temp;
                }
            }
        }
        return arr;
    }
    var arr = [1,9,3,7,2,8,3,99,44,1,6];
    maopao(arr);
    console.log("冒泡排序");
    console.log(arr);

快速排序

// 2.快速排序
一趟快速排序的算法是:   

1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;   

2)以第一个数组元素作为关键数据,赋值给key,即 key=A[0];   

3)从j开始向前搜索,即由后开始向前搜索(j=j-1即j--), 找到第一个小于key的值A[j],A[i]与A[j]交换;   

4)从i开始向后搜索,即由前开始向后搜索(i=i+1即i++), 找到第一个大于key的A[i],A[i]与A[j]交换;   

5)重复第3、4、5步,直到I=J; (3,4步是在程序中没找到时候j=j-1,i=i+1,直至找到为止。 找到并交换的时候i, j指针位置不变。另外当i=j这过程一定正好是i+或j-完成的最后令循环结束)

    function quickSort(arr){
        // 如果数组长度小于等于1,直接返回
        if(arr.length<=1){return arr;}
        // 选择一个基准
        var pivotIndex = Math.floor(arr.length/2);
        // 将基准与原数组分离
        var pivot = arr.splice(pivotIndex,1)[0];
        // 定义左右两个空数组用来存放
        var left = [];
        var right=[];
        // 循环,如果小于基准就放左边,大于基准就放右边
        for(var i=0;i<arr.length;i++){
            if(arr[i]<=pivot){
                left.push(arr[i]);
            }else{
                right.push(arr[i]);
            }
        }
        // 使用递归
        return quickSort(left).concat(pivot, quickSort(right));

    }
    var arr2 = [999,9,3,7,24,8,3,99,44,1,6];
    console.log("快速排序")
    console.log(quickSort(arr2));

3.选择排序

选择排序相比冒泡排序不稳定,时间复杂度也是。选择排序没趟都会产生最小值,它不是相邻元素的比较而是在该元素设置一个索引i。然后与数组的其他元素依次比较(除了上一个索引值),直到找到小于该元素(索引j)时交换两元素,接着继续从i索引(此时已经不是原来的数值)值与索引j+1值比较。
// 选择排序

    function selectSort(arr){
        var minIndex;
        var temp;
        // 循环
        for(var i=0;i<arr.length-1;i++){
            minIndex=i;
            // 找到从i开始到最后的最小的数
            for(var j=i+1;j<arr.length;j++){
                if( arr[j] < arr[minIndex] ) {
                    minIndex = j;
                }
            }
        
            temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        } 
        return arr;
    }
    var arr3 = [99,9,3,7,24,8,3,99,44,1,6];
    
    console.log(selectSort(arr3));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值