数组经典排序算法之选择排序,插入排序,希尔排序

66 阅读1分钟

选择排序

1选出最小的数放在首位 2再从剩余元素继续查找最小值,以此类推

20200717094201692.gif

const choose = (arr) => {
 
    for (let j = 0; j < arr.length - 1; j++) {

        let min = j

        for (let i = min + 1; i < arr.length; i++) {

            if (arr[min] > arr[i]) {

                min = i

            }

        }

        [arr[j], arr[min]] = [arr[min], arr[j]]

    }

  


}

插入排序

插入排序 我的理解是反向冒泡,选择一个数依次与自己前一个数比较,小则往前插入,以此类推

5add98a0c9624d26bab3d9a4976b5de6.gif

const ins = (arr) => {
    for (let j = 1; j < arr.length; j++) {

        let min = j

        for (let i = j - 1; i >= 0; i--) {

            if (arr[min] < arr[i]) {

                [arr[min], arr[i]] = [arr[i], arr[min]]

                min = i

            }
        }
    }


}

希尔排序

希尔排序是插入排序的升级版

步骤

(1)在第一趟排序中,我们不妨设 gap1 = N / 2 = 5,即相隔距离为 5 的元素组成一组,可以分为 5 组。

(2)接下来,按照直接插入排序的方法对每个组进行排序。

在第二趟排序中,我们把上次的 gap 缩小一半,即 gap2 = gap1 / 2 = 2 (取整数)。这样每相隔距离为 2 的元素组成一组,可以分为 2 组。

(3)按照直接插入排序的方法对每个组进行排序。

(4)在第三趟排序中,再次把 gap 缩小一半,即gap3 = gap2 / 2 = 1。 这样相隔距离为 1 的元素组成一组,即只有一组。

(5)按照直接插入排序的方法对每个组进行排序。此时,排序已经结束。 原文链接:blog.csdn.net/qq845579063…

20160518211420194.png

const arr = [9,1,2,5,7,4,8,6,3,5]
const dsdaa = (arr) => {

    let gap = Math.floor(arr.length / 2)

    while (gap >= 1) {

        for (let j = gap; j < arr.length; j += gap) {

            for (let i = j; i >= gap; i -= gap) {

                if (arr[i] < arr[i - gap]) [arr[i], arr[i - gap]] = [arr[i - gap], arr[i]]

            }

        }

        gap = Math.floor(dd / 2)

    }


}
dsdaa(arr) //[1,2,3,4,5,6,7,8,9]