[路飞]_ 冒泡排序、选择排序、插入排序

178 阅读2分钟

这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

冒泡排序和插入排序都是比较经典的排序方式,这里针对自己的理解做了图文和代码注释加以说明。加深自己的学习印象。

冒泡、插入,选择只是基础排序,时间复杂度O(n2),这种排序不会在实际过程中使用,我们要了解的是他的思想

冒泡排序:

\

function bubbleSort(arr){
    let sorted = false; 
    while(!sorted){ // arr[i] 没有比arr[i+1]大的情况 就结束了
        sorted = true
        for(let i=0; i < arr.length; i++){
            if(arr[i] > arr[i+1]){  // 进行两两对比
                [arr[i],arr[i+1]] = [arr[i+1],arr[i]]
                sorted = false  //交换完成 置为false
            }
        }
    }
    return arr
}

插入排序 (扑克排序)

插入排序的思想是选择一个起始作为参考元素, 将参考元素在和左侧做一一比较,如果被比较的元素大则右移, 否侧比较结束,将参考元素放到停止比较的位置, 重复上述操作,完成排序.

function insertionSort(arr){
    let len = arr.length;
    let temp ,pos // pos记录最终停止比较的位置
    for(let i = 0; i < len ; i ++){
        let temp = arr[i]
        pos = i // 参考元素索引
        while(pos > 0 && arr[pos-1] > temp){
            arr[pos] = arr[pos -1]
            pos --
        }
        arr[pos] = temp // 将temp放到停止比较的位置
    }
    return arr
} 
insertionSort([5,4,3,2,1])

选择排序

顾名思义,选择排序是选择一个元素,假设他最小然后 和 其他元素进行比较,标记最小索引位置, 完成内侧循环后,将最小位置和当初选择的元素进行位置交换, 直到最后一个元素,则完成排序.

function selectionSort(arr){ 
    let min; // 这个变量记录最小值对应的索引 
    for(let i = 0; i < arr.length; i++ ){ 
        min = i // 将min 之后的元素和min 一一比较 所以 j的初始值是 i 
        for(let j = i + min; j < arr.length; j++){
            if(arr[min] > arr[j]){ 
                min = j // 此时对应的最小索引位是j 记录下来 
            } 
        } 
        // 进行一轮循环之后 最小索引位的值和 比对元素 做位置交换
        [arr[min], arr[i]] = [arr[i], arr[min]]
   } 
   return arr 
}