zoukankan      html  css  js  c++  java
  • JS-排序详解:冒泡排序、选择排序和快速排序

    JS-排序详解-冒泡排序

    说明

    • 时间复杂度指的是一个算法执行所耗费的时间
    • 空间复杂度指运行完一个程序所需内存的大小
    • 稳定指,如果a=b,a在b的前面,排序后a仍然在b的前面
    • 不稳定指,如果a=b,a在b的前面,排序后可能会交换位置

    JS冒泡排序

    原理

    依次比较相邻的两个值,如果后面的比前面的小,则将小的元素排到前面。依照这个规则进行多次并且递减的迭代,直到顺序正确。

    时间复杂度,空间复杂度,稳定性

    • 平均时间复杂度O(n*n)
    • 最好情况O(n)
    • 最差情况O(n*n)
    • 空间复杂度O(1)
    • 稳定性:稳定

    冒泡排序的写法

    复制代码
    var examplearr=[8,94,15,88,55,76,21,39];
    function sortarr(arr){
        for(i=0;i<arr.length-1;i++){
            for(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;
    }
    sortarr(examplearr);
    console.log(examplearr);
    复制代码

    解析

    两个循环
    当i=0的时候,里面的循环完整执行,从j=0执行到j=6,这也就是第一遍排序,结果是将最大的数排到了最后,这一遍循环结束后的结果应该是[8,15,88,55,76,21,39,94]
    当i=1的时候,里面的循环再次完整执行,由于最大的数已经在最后了,没有必要去比较数组的最后两项,这也是j<arr.length-1-i的巧妙之处,结果是[8,15,55,76,21,39,88,94]
    说到这里,规律就清楚了,每次将剩下数组里面最大的一个数排到最后面,当第一个循环执行到最后的时候,也就是i=6,此时,j=0,只需要比较数组的第一和第二项,比较完毕,返回。

    JS-排序详解-选择排序

    说明

    • 时间复杂度指的是一个算法执行所耗费的时间
    • 空间复杂度指运行完一个程序所需内存的大小
    • 稳定指,如果a=b,a在b的前面,排序后a仍然在b的前面
    • 不稳定指,如果a=b,a在b的前面,排序后可能会交换位置

    JS选择排序

    原理

    首先从原始数组中找到最小的元素,并把该元素放在数组的最前面,然后再从剩下的元素中寻找最小的元素,放在之前最小元素的后面,知道排序完毕。

    时间复杂度,空间复杂度,稳定性

    • 平均时间复杂度O(n*n)
    • 最好情况O(n*n)
    • 最差情况O(n*n)
    • 空间复杂度O(1)
    • 稳定性:不稳定

    选择排序的写法

    复制代码
    var example=[8,94,15,88,55,76,21,39];
    function selectSort(arr){
        var len=arr.length;
        var minIndex,temp;
        console.time('选择排序耗时');
        for(i=0;i<len-1;i++){
            minIndex=i;
            for(j=i+1;j<len;j++){
                if(arr[j]<arr[minIndex]){
                    minIndex=j;
                }
            }
        temp=arr[i];
        arr[i]=arr[minIndex];
        arr[minIndex]=temp;
        }
        console.timeEnd('选择排序耗时');
        return arr;
    }
    console.log(selectSort(example));
    复制代码

    解析

    minIndex始终保存着最小值的位置的索引,随着i的自增,遍历的数组长度越来越短,直到完成排序。

      

    JS-排序详解-快速排序

     
     

    说明

    • 时间复杂度指的是一个算法执行所耗费的时间
    • 空间复杂度指运行完一个程序所需内存的大小
    • 稳定指,如果a=b,a在b的前面,排序后a仍然在b的前面
    • 不稳定指,如果a=b,a在b的前面,排序后可能会交换位置

    JS快速排序

    原理

    从数组中选定一个基数,然后把数组中的每一项与此基数做比较,小的放入一个新数组,大的放入另外一个新数组。然后再采用这样的方法操作新数组。直到所有子集只剩下一个元素,排序完成。

    时间复杂度,空间复杂度,稳定性

    • 平均时间复杂度O(nlogn)
    • 最好情况O(nlogn)
    • 最差情况O(n*n)
    • 空间复杂度O(logn)
    • 稳定性:不稳定

    快速排序的写法

    复制代码
    var examplearr=[8,94,15,88,55,76,21,39];
    function fastsort(arr){
        if(arr.length<2){
            return arr;
        }
        var left=[];
        var right=[];
        var pivotIndex=Math.floor(arr.length/2);
        var pivot=arr.splice(pivotIndex,1)[0];
        for(i=0;i<arr.length;i++){
            if(arr[i]<pivot){
                left.push(arr[i]);
            }else{
                right.push(arr[i])
            }
        }
        return fastsort(left).concat([pivot],fastsort(right));
    }
    console.log(fastsort(examplearr));
    复制代码

    解析

    pivotIndex是将数组的长度除2向下取整得到的一个数值,数组的长度是不断减半的,所以最后它的值为0
    pivot是利用splice方法从数组里获取一个基数
  • 相关阅读:
    HDU 2089 不要62
    HDU 5038 Grade(分级)
    FZU 2105 Digits Count(位数计算)
    FZU 2218 Simple String Problem(简单字符串问题)
    FZU 2221 RunningMan(跑男)
    FZU 2216 The Longest Straight(最长直道)
    FZU 2212 Super Mobile Charger(超级充电宝)
    FZU 2219 StarCraft(星际争霸)
    FZU 2213 Common Tangents(公切线)
    FZU 2215 Simple Polynomial Problem(简单多项式问题)
  • 原文地址:https://www.cnblogs.com/wu-chao/p/8522598.html
Copyright © 2011-2022 走看看