• Javascript数组中常用的排序法 ——冒泡排序法和选择排序法以及快速排序法


    所谓排序法,就是对一组无序的序列进行有序的排序(从大到小或者从小到大),那么什么叫冒泡排序法,冒泡排序法又是怎么实现数组的有序排列呢?

    1、 冒泡排序法(Bubblesort)

    冒泡排序法的具体实现方法是这样的,从数组的第一个元素`arr[0]`开始,两两比较**(`arr[n],arr[n+1]`),如果前面的数大于后面的数(`arr[n] > arr[n+1]`),那么交换两个元素的位置,把大的数往后移动。这样依次经过一轮比较以后,最大的数将会被交换到最后的位置。总的来说,冒泡排序法就是两两进行比较。

    下面具体来看一下冒泡排序法是如何进行的。

      数组排序前    7    23    12    4    33    21    2    17    13    9          
      第一轮排序    7    12    4    23    21    2    17    13    9    33    
      第二轮排序    7    4    12    21    2    17    13    9    23    
      第三轮排序    4    7    12    2    17    13    9    21                 
      第四轮排序    4    7    2    12    13    9    17    
      第五轮排序    4    2    7    12    9    13        
      第六轮排序    2    4    7    9    12        
      第七轮排序    2    4    7    9    
      第八轮排序    2    4    7   
      第九轮排序    2    4     

    可以看到,每一轮的排序,在这一轮中参与比较的元素中最大的数将会浮到最后。

    下面举个简单的例子来看一下冒泡排序法是如何使用的。

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    </head>
    <body>
     </body>
    </html>
    <script>
    var arr = [10,19,8,37,6];                      //首先先定义一个数组;
    var temp;                                            //定义一个变量temp;
    for(var i=0;i<arr.length-1;i++){            //通过for循环来实现两两比较;
                                                           
    for(var j=0;j<arr.length-1-i;j++){

    if(arr[j]>arr[j+1]){                                //如果arr[j]>arr[j+1]为true,则他们两个的值进行互换,最终得到从小到大的排序。
    temp = arr[j];
    arr[j] = arr[j+1];
    arr[j+1] = temp;
    }

    }
    }

    console.log(arr);                               //通过在console控制台上进行查看结果。
    </script>
    2、选择排序法(Selectionsort)
    所谓的选择是什么意思呢,选择就是于万千花丛中择其一,在选择排序法中说的就是,每一次循环过程中,通过比较选择出你需要的**最值**。选择排序法的过程是,通**过比较,选择出每一轮中最值元素,然后把他和这一轮中最最前面的元素交换**,所以这个算法关键是要记录每次比较的结果,即每次比较后最值位置(下标)。

    先来看看选择排序的过程
    数组排序前    7    23    12    4    33    21    2    17    13    9      
    第一轮循环    2    23    12    4    33    21    7    17    13    9          
    第二轮循环          4      12    23    33    21    7    17    13    9    
    第三轮循环                   7      23    33    21    12    17    13    9    
    第四轮循环                          9      33    21    12    17    13    23         
    第五轮循环                                   12    21    33    17    13    23    
    第六轮循环                                           13    33    17    21    23   
    第七轮循环                                                   17    33    21    23    
    第八轮循环                                                           21    33    22   
    第九轮循环                                                                    22    33

    通过这个过程,我们可以看到,每轮循环过程中,都会找出这个最值元素,下一轮排序时就不用再考虑这个元素了。

    下面同样通过一个例子来说明一下选择排序法的用法。

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    </head>
    <body>
    </body>
    </html>
    <script>
    var arr = [10,9,8,7,6];                     //同样先给定一个数组;
    var temp;                                       //定义一个变量temp;
    for(var i=0;i<arr.length-1;i++){       //通过for循环来找出最值;
    for(var j=i+1;j<arr.length;j++){

    if(arr[i]>arr[j]){                                //最后再将arr[i]与arr[j]的值进行比较;
    temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
    }

    }
    }

    console.log(arr);                           //最后在console控制台查看结果;
    </script>
    3、快速排序法(Quicksort)
    快速排序(Quicksort)是对冒泡排序的一种改进。
    它的基本思路:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
    下面通过一个例子来看一下快速排序法如何使用的。
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    </head>
    <body>
     
    </body>
    </html>
    <script>
    var arr = [10,66,3,64,2,98];
    function fn(arr){                                   //定义一个函数function fn(arr);
    //取中间值
    var index = arr.length%2 == 0?arr.length/2 : (arr.length+1)/2;
    //中间值
    var mid = arr[index];
    var left = [];
    var right = [];
    if(arr.length<2){
    return arr;
    }
    //核心
    for(var i=0;i<arr.length;i++){            //难点;需要多去理解。
    if(index !=i && arr[i]<mid){
    left.push(arr[i]);
    }
    if(index != i && arr[i]>=mid){
    right.push(arr[i]);
        }
    }
    return fn(left).concat(mid).concat(fn(right));
    }
    console.log(fn(arr));
    </script>
    最后总结一下,
    冒泡排序法是两两依次比较,并做交换,交换的次数多。
    选择排序法是每次循环找出最值,循环结束后将最值调整到合适位置,交换的次数少。
    快速排序法思路比较清晰明确,能够快速的找到解题的方法。
  • 相关阅读:
    python第三方库requests详解
    英语单词Permissive
    Linux系统重要文件(三)
    Linux系统重要文件(二)
    Linux系统重要文件
    操作系统挂载
    Linux系统基础优化
    系统软件安装
    MYSQL二进制安装
    MySQL基本操作
  • 原文地址:https://www.cnblogs.com/hexinkui/p/10639898.html
Copyright © 2020-2023  润新知