排序和搜索算法学习之选择排序和插入排序

195 阅读2分钟

来了广东就是靓仔!!但是 --- 不学习和咸鱼有什么分别?

此文 是 讲排序算法中的选择排序和插入排序

选择排序

  • 选择排序是一种原址比较排序算法。选择排序的大致思路是找到数据结构中的最小值并且将其放置到第一位,接着找到第二小的值将其放置在第二位,以此类推。
  • 此处沿用上篇 冒泡排序中的辅助函数。👉 排序和搜索算法学习之冒泡
    // 此处沿用上篇 冒泡中的辅助函数 
    function ArrayList() {
        var array = [];
        this.insert  = function(element) {
            array.push(element);
        } 
        this.toString = function() {
            return array.join();
        }
        // 交换函数
        var swap = function(array, index1, index2) {
            var aux = array[index1];
            array[index1] = array[index2];
            array[index2] = aux;
            // es6交换的方式 ---增强的对象属性
            // [array[index1], array[index2]] = [array[index2], array[index1]]
        }
    }
    
    // 在 ArrayList 中 写入 选择排序
    this.selectionSort = function() {
        var length = array.length, indexMin;
        for (var i = 0; i < length-1; i++) {
            indexMin = i;
            for (var y = 0; j < length; j++) {
                if (array[indexMin] > array[y]) {
                    indexMin = y
                }
            }
            if (i !== indexMin) {
                swap(array, i, indexMin)
            }
        }
    }
    

选择排序的测试

    console.time('array 3')
    var array3 = createNotSortedArray(10);
    console.log(array3.toString()); // 10,9,8,7,6,5,4,3,2,1
    array3.selectionSort();
    console.log('sorted', array3.toString()); // sorted 1,2,3,4,5,6,7,8,9,10
    console.timeEnd('array 3') // array 3: 0.25ms

👉 选择算法也是一个复杂度为O(n²)的算法,和冒泡一样,它嵌套了两个循环,导致了二次方的复杂度。

插入排序

  • 概念:插入排序每次排一个数组项,以此方式构建最后的数组,假定第一项已经排序了,接着把它和第二项比较,判断第二项应该放在第一项的左边还是右边,以此类推。
  • 此处沿用上篇 冒泡排序中的辅助函数。👉 排序和搜索算法学习之冒泡
    // 插入排序
    this.insertionSort = function() {
        var length = array.length, j, temp;
        for (var i = 1; i < length; i++) {
            j = i;
            temp = array[i];
            while (j>0 && array[j-1] > temp) {
                array[j] = array[j-1];
                j--;
            }
            array[j] = temp;
        }
    }
    

测试 👌

    console.time('array 4')
    var array4 = createNotSortedArray(10);
    console.log(array4.toString()); // 10,9,8,7,6,5,4,3,2,1 
    array4.insertionSort();
    console.log('sorted', array4.toString()); // sorted 1,2,3,4,5,6,7,8,9,10
    console.timeEnd('array 4') // array 4: 0.222021484375ms

从时间上不难看出,此算法相对选择排序和冒泡排序的性能要好(排序小型数组时)

结语:Sweat is the lubricant of success.汗水是成功的润滑剂。