zoukankan      html  css  js  c++  java
  • 【读书笔记】理解基本排序算法

    开始日期:2018/07/23

    前言

    近段时间一直在阅读《数据结构与算法JavaScript描述》这本书,重新学习下算法。算法是作为一个程序员的基本素养,还是掌握一些基本的算法的,譬如排序算法。排序算法又分为基本排序算法和高级排序算法,以排序的效率来划分。以下的冒泡排序就是基本排序算法,最慢的排序算法之一。

    冒泡排序

    最慢的排序算法之一,数据值会像气泡一样从数组的一端飘向另一端。之所以会产生这种现象是因为算法会多次在数组中移动,比较相邻的数据,假设按升序排序,则当左侧值大于右侧值时将它们进行互换。
    示例代码:

    function bubbleSort(arr){
                var length = arr.length;
                // 数组交换方法
                var swap = function(arr,index1,index2){
                    var temp = arr[index1];
                    arr[index1] = arr[index2];
                    arr[index2] = temp;
                }
                // 外循环则表示相邻比较的次数,比较一次后,最大的数会移向最右侧,则次数减一,进行下一轮循环
                for(var outer = length; outer >= 2; --outer){
                // 内循环则表示从第一个数值开始相邻比较,一直到最后一个
                    for(var inner = 0; inner< outer; ++inner){
                        if(arr[inner]>arr[inner+1]){
                        swap(arr,inner,inner+1);
                        }
                    }
                }
                return arr;
            }
    

    选择排序

    选择排序从数组的开头开始,将第一个元素和其它元素进行比较。检查完所有的元素后,最小的元素会被放到数组的第一个位置,然后算法会在第二个位置继续。这个过程一直进行,当进行到数组倒数的第二个位置时,所有的数据便完成了排序。选择排序会用到嵌套循环。外循环从数组的第一个元素移动到倒数第二个元素,因为是从第一个跟其它元素比较,所以循环到倒数第二个时,则与最后一个元素比较。内循环则从第二个数组元素移动到最后一个元素,查找比当前外循环所指向的元素小的元素。
    示例代码:

    function selectionSort(arr){
                var min;
                var swap = function(arr,index1,index2){
                    var temp = arr[index1];
                    arr[index1] = arr[index2];
                    arr[index2] = temp;
                }
                for(var outer = 0; outer <= arr.length-2;++outer){
                    min = outer;
                    for(var inner = outer+1; inner <= arr.length-1;++inner){
                        if(arr[inner]<arr[min]){
                            min = inner;
                        }
                        swap(arr,outer,min);
                    }
                }
                return arr;
            }
    

    插入排序

    插入排序类似于人类按数字或字母顺序对数据进行排序。插入排序有两个循环。外循环将数组挨个移动,而内循环则对外循环选中的元素及它后面的那些元素进行比较。如果外循环选中的元素比内循环中选中的元素小,则数组会向右移动,为内循环中的这个元素腾出位置。外循环从第二个元素开始,因为默认与第一个比较,比较完后,从三个元素开始与前面两个元素进行比较,后面的以此类推,如果比前面的元素大则不用换位置,否则向前面插入,后面的元素往后移动。
    示例代码:

    function insertionSort(arr){
        var temp,inner;
        for(var outer = 1; outer <= arr.lengtn -1 ; ++outer){
            temp = arr[outer];
            inner = outer;
            while(inner > 0 && arr[inner-1] >= temp ){
                arr[inner] = arr[inner-1];
                —-i;
            }
            arr[inner] = temp;
        }
    }
    

    基本排序算法的时间复杂度比较

    基本排序算法计时比较

    经测试,对于100个元素执行排序,三种算法没有显著差别。
    对于10000个元素排序,选择排序和插入排序要比冒泡排序快,插入排序是这三种算法最快的。

  • 相关阅读:
    dfs 与 剪枝
    杭电OJ1789、南阳OJ236(贪心法)解题报告
    多边形面积问题(hdoj2036)
    retain copy(浅复制) mutablecopy (深复制)
    IOS开发的目录结构
    UITableView 委托方法总结
    ios block
    UITableView 学习笔记
    iso socket基础2
    ios socket(基础demo)
  • 原文地址:https://www.cnblogs.com/GeniusLyzh/p/9548587.html
Copyright © 2011-2022 走看看