排序算法(持续更新中)

214 阅读3分钟

冒泡排序

核心思维逻辑:比较并交换(如果大的数在左侧)相邻两个数,以保证将最大的数放在数组最右侧,就像冒泡泡一样,越到右侧越大。

第一步:

对数组从头开始遍历,例如let k = 0;k< arr.length; k++。然后对相邻的两个数进行判断,如果数组下标小的数值大于下标大的数值(数组左侧的值要小于右侧的值),则将两个值进行调换。保证了经过这一轮数组中最右侧的值为整个数组的最大值。

第二步:

但是第一步只是保证了最右侧的值最大,其他地方是否按顺序排列不能保证,于是我们用第一步的思想对数组进行第二次排序。这可以得到最右侧的第一二个值为数组第一二大的值。于是我们用第一步的思想对数组进行数组长度次(arr.length)的排序。这样就能保证整个数组按顺序排序。

第三步:

因为第一次排序最右侧的值为最大,所以第二次排序可以不用比较arr[length-2]跟arr[length-1]的值(数组最右侧跟第二右侧的值)

根据思维逻辑可以写出冒泡排序的代码

        function BubbleSort(arr){
            for(let i = 0; i < arr.length; i++){
                for(let k = 0; k < arr.length - i; k++){
                    if(arr[k]>arr[k+1]){
                        let b = arr[k];
                        arr[k] = arr[k+1];
                        arr[k+1] = b;
                    }
                }
            }
            console.log(arr);
            //(14) [1, 2, 2, 4, 5, 6, 6, 7, 45, 45, 213, 432, 457, 2334]
        }

        BubbleSort([2,5,1,2,4,6,7,6,432,45,457,45,2334,213])
时间复杂度为O(n的2次方)

选择排序

核心思维逻辑:将数组看为两个数组,一个是排好序的数组(一开始为空),一个是没有排序的(就是整个数组)。在未排序的数组里遍历,将最小的值丢进排有序数组。

第一步:

遍历数组,将最小值的数与最左侧的数进行交换。来保证最左侧的值是数组里最小的值。(将无序数组中的最小值放入有序数组。这里就可以保证有序数组插入的值永远比之前的值大,并且是)

第二步:

然后将要遍历的值去除最左侧的值,即一开始是从0——lengh-1里开始遍历,完成一次操作后,第二次便从1——length-1开始遍历。(确认无序数组中的值的完整性)重复后得到一个有序数组(无序数组全部插入到有序数组里)

根据思维逻辑可以写出选择排序的代码

        function SelectionSort(arr){
            let len = arr.length ;
            let minIndex , temp;
            for(let i = 0; i < len; i++){
                //minIndex记录最小值的位置
                minIndex = i;
                for(let k = i + 1; k < len; k++){
                    //遍历完成后获得无序数组中最小值下标
                    if(arr[k] < arr[minIndex]){
                        minIndex = k;
                    }
                }
                //将无序数组中最小值放到有序数组中,一开始有序数组没指,便将数组第一个值当成有序数组
                temp = arr[i];
                arr[i] = arr[minIndex];
                arr[minIndex] = temp;
            }
            console.log(arr);
            //[2, 3, 3, 6, 6, 7, 8, 9, 9, 9, 12, 23, 45, 634, 657]
        }

        SelectionSort([12,2,6,8,9,3,3,6,7,9,9,657,45,634,23])

插入排序

核心思维逻辑:分为两个数组,一个是有序数组(一开始为无),一个是无序数组。从无序数组中拿到值,按顺序插入到有序数组中;

第一步:

将无序数组的值与有序数组的值作比较,按顺序插入到有序数组里。这里是当无序数组的值小于有序数组时,插入到那个有序数组的值前面。(先存无序数组的值,从无序数组中删除那个值,在有序数组中插入那个值)

第二步:

循环无序数组,知道无序数组中无值。

根据思维逻辑可以写出插入排序的代码

        function insertSort(arr){
            for(let i = 0 ; i < arr.length; i++){
                for(let j = 0 ; j < i + 1; j++){
                    if(arr[i] < arr[j]){
                        let temp = arr[i]
                        arr.splice(i,1);
                        arr.splice(j,0,temp);
                        break;
                    }
                }
            }
            console.log(arr);
        }

        insertSort([1,5,76,23,5,9,7,6,4,6,8])