【读书笔记】理解基本排序算法

开始日期: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个元素排序,选择排序和插入排序要比冒泡排序快,插入排序是这三种算法最快的。

原文地址:https://www.cnblogs.com/GeniusLyzh/p/9548587.html