6月25日算法日记

80 阅读1分钟

1.冒泡排序

在这里插入图片描述

思路

假设该排序要求升序排列

首先使用一个for循环将数组进行遍历,然后在for循环中嵌套一个for循环每次拿两个数字nums[j]和nums[j+1]进行比较,如果nums[j]>nums[j+1],则将二者交换位置,将大的数字进行不断后移,这样每次最大的数字都可以排列到最后,慢慢该数组就升序排列了。

image-20220625224046613

var sortColors = function(nums) {
    if(nums.length == 0) return nums
    //冒泡排序
    for(let i = 0; i < nums.length; i++) {
        for(let j = 0; j < nums.length - i; j++) {
            let temp
            if(nums[j] > nums[j+1]) {
                temp = nums[j]
                nums[j] = nums[j+1]
                nums[j+1] = temp
            }
        }
    }
    return nums
};

2.选择排序

img

思路

假设也是升序排序

选择排序和冒泡排序不同的就是,每次循环中找到最小的数字然后将该数字移到最前面,选择排序其实也是冒泡排序的优化。

image-20220625223950579

var sortArray = function(nums) {
    if(!nums.length) return nums
    for(let i = 0; i < nums.length; i++) {
        //定义变量保存最小数字的索引
        let index = i
        //因为j每次从i开始遍历的,每次找到的最小数字移动到数组最前面后就不会继续遍历该数字了
        for(let j = i; j < nums.length; j++) {
            //本次循环结束后就可以得到最小数字的索引值
            if(nums[j] < nums[index]) {
                index = j
            }
        }
        //拿到最小数字后,将该数字移到数组的最前面
        let temp = nums[index]
        nums[index] = nums[i]
        nums[i] = temp
    }
    return nums
};

3.插入排序

img

思路

假设是升序排序

比较前两个数字的大小使得较小的数在前面,目前已排序好的数据有两个数字称之为ascArr

第三个数字curVal首先和ascArr的最后一个数字bigNum比较,如果curVal<bigNum,则将bigNum后移一位,然后继续比较curVal和ascArr的倒数第二个数,这样又可以得到一个有序的数组。以此类推,就可以得到一个升序的数组。

image-20220626002004593

var sortArray = function(nums) {
    if(!nums.length) return nums
    //如果i < nums.length作为临界条件的话,假设length为4,则在最后一次循环时nums[3+1]就取不到了
    for(let i = 0; i < nums.length-1; i++) {
        let curVal //当前待排序的元素
        let preIndex = i //已经排序好的元素索引
        curVal = nums[preIndex + 1]
        while(preIndex >= 0 && curVal < nums[preIndex]) {
            nums[preIndex+1] = nums[preIndex]
            preIndex--
        }
        //因为在while循环中已经被--过一次,需要加+1才可以得到对应需要插入的位置
        nums[preIndex+1] = curVal
    }
    return nums
};