冒泡排序,插入排序,快速排序总有一款适合你

/**
 * 冒泡算法
 * 比较两两值,一次冒泡之后最右边的值肯定是为最大的
 * 第二次冒泡,就只要针对除去最后一个值的数值进行冒泡
 * [22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70]
 */
function bubble_one_time(arr, j) {
    for (let i = 0; i < arr.length-j; i++) {
        const element = arr[i];
        if (arr[i] > arr[i+1]) {
            let temp
            temp = arr[i+1]
            arr[i+1] = arr[i]
            arr[i] = temp 
        }
    }
    return arr
}
function bubble_sort (arr) {
    for (let i = 0; i < arr.length; i++) {
        arr = bubble_one_time(arr, i)
    }
    return arr
}
/**
 * 插入排序
 * 从原数组一个一个遍历,将其放到新数组,但要
 * 维持新数组的序列
 */
function insertSort (arr, l, r) {
    for (let i = l + 1; i <= r; i++) {
        if (arr[i] < arr[i-1]) {
            let temp = arr[i]
            let j = i
            while (j > l && arr[j-1] > temp ) {
                arr[j] = arr[j-1]
                j--
            }
            arr[j] = temp
        }
    }
}
/**
 * 快速排序
 * 是对冒泡排序的一种改进
 * 通过一趟排序将数据分为两部分,再对这两部分
 * 分别递归排序,以此类推
 * 双向的扫描比单项扫描快
 */
function quick_sort(arr, l, r) {
    if (l < r) {
        let e = quick_one_time(arr, l, r) // e 是一次快排的分界线,以此对左右两边再进行快排
        quick_sort(arr, l, e-1)
        quick_sort(arr, e+1, r)
    }
    return arr
}   
function quick_one_time (arr,i,j) {
    // i 和 j是两个指针,初始的时候分别指向首尾
    // 设定一个基准值 初始为 arr[0]
    let pivot = arr[i]
    // 现在指针移动,
    while (i < j) {
        while(arr[j] > pivot && i < j){
            j--
        }
        arr[i] = arr[j]
        while (arr[i]< pivot && i < j) {
            i++
        }
        arr[j] = arr[i]
    }
    // 指针重叠,说明遍历完一次了
    arr[i] = pivot
    return i
}

 

posted @ 2019-07-26 17:04  麦丽素  阅读(339)  评论(0编辑  收藏  举报