算法入门练习 常用的五个排序算法

84 阅读2分钟

算法入门 常用的五个排序算法

  • 冒泡排序
<script>
        // 冒泡排序,从头开始一项一项比较
        // 双重循环,逐项比较,效率很低
        // 升序降序取决于从头遍历还是从尾遍历,和数据交换的条件
        let arr = [2, 9, 8, 5, 2, 8, 7, 5, 2, 9]
        bubble(arr)
        console.log(arr)
        function bubble(arr) {
            let len = arr.length;
            for (let i = 0; i <= len - 1; i++) {
                for (let j = i + 1; j <= len - 1; j++) {
                    if (arr[i] < arr[j]) {
                        let temp = arr[i]
                        arr[i] = arr[j]
                        arr[j] = temp
                    }
                }
            }
        }
    </script>

快速排序

<script>
        // 快速排序
        // 取每一个区间的中间值,根据对中间值的比较将划数组划分为分左右区间,递归一直到无法划分为止
        let arr = [2, 9, 8, 5, 2, 8, 7, 5, 2, 9]
        function quickSorts(arr) {
            let len = arr.length;
            if (len === 0) return arr;

            // 处理下左右两个数组,首先要拿到中值
            let midIndex = Math.floor(len / 2);

            let midValue = arr.splice(midIndex, 1)[0]; //中间值,如果数组长度是偶数怎那么算的?先存疑问,偶数就是len === 0的情况

            let left = [];
            let right = [];
            for (let i = 0; i < arr.length; i++) {
                if(arr[i]<midValue){
                    left.push(arr[i])
                }else{
                    right.push(arr[i])
                }
            }
            return quickSorts(left).concat([midValue], quickSorts(right))
        }
        
        console.log(quickSorts(arr))

    </script>
  • 插入排序
 <script>
        let arr = [2, 9, 8, 5, 2, 8, 7, 5, 2, 9]
        function insertSrots(arr) {
            let len = arr.length
            if (len <= 1) return

            for (let i = 1; i < len; i++) {
                let temp = arr[i];//这个是需要移动的值?
                let j = i
                // 向前找,看有没有能插入的地方,怎么插入
                // 在这层循环中,i没有发生变化,所以不适用于对i下边所映射的元素做改动
                // 插入排序相当于要找到下标,找不到下标的情况下,就让整体元素往后移动
                // 找到下标就要赋值,判断条件说白了是寻找合适下标的过程
                // 包含两个注意点,数组的后移挪位+下标寻找
                for (; j >= 0; j--) {
                    if (temp > arr[j - 1]) {
                        arr[j] = arr[j - 1]
                    } else {
                        break;
                        // continue;
                    }
                }
                arr[j] = temp
            }
            return arr
        }

        console.log(insertSrots(arr))
    </script>
  • 归并算法
<script>

        // 归并总共两个步骤,
        // 1、拆分数组至最小区间,每次拆分分左右区间
        // 2、对最小区间进行合并排序
        let arr = [2, 9, 8, 5, 2, 8, 7, 5, 2, 9]
        console.log(mergeSort(arr))

        function mergeSort(arr) {
            let len = arr.length;
            if (len == 1) return arr;
            let midIndex = Math.floor(len / 2)
            let left = arr.slice(0, midIndex);
            let right = arr.slice(midIndex);

            return merge(mergeSort(left), mergeSort(right))
        }

        function merge(left, right) {
            let res = []
            while (left.length && right.length) {
                if (left[0] > right[0]) {
                    res.push(left[0])
                    left.shift()
                } else {
                    res.push(right[0])
                    right.shift()
                }
            }
            if (left.length) {
                res=res.concat(left)
            } else {
                res=res.concat(right)
            }

            return res
        }
    </script>
  • 插入排序
<script>
        // 找到最小(最大)的元素,将其放在末尾(开头),以此达到排序的目的
        // 分两步
        // 1、找到最小下标
        // 2、将其放在开头
        let arr = [2, 9, 8, 5, 2, 8, 7, 5, 2, 9]
        console.log(choiceSorts(arr))

        function choiceSorts(arr) {
            for (let i = 0; i < arr.length; i++) {
                let minIndex = i;
                for (let j = i; j < arr.length; j++) {
                    if (arr[j] < arr[minIndex]) {
                        minIndex = j
                    }
                }
                if (minIndex === i) continue;
                let temp = arr[i]
                arr[i] = arr[minIndex]
                arr[minIndex] = temp
            }
            return arr
        }
    </script>