快速排序图解及手写 | 创作者训练营

212 阅读2分钟

前言

最近开始复习一点算法知识,而排序可以说是算法里的基础了,今天就让我带大家重温(xue xi)一下三大经典算法, 冒泡排序、插入排序、快速排序中的快速排序算法吧。

简介 (wiki 百科)

快速排序(英语:Quicksort),又称分区交换排序(partition-exchange sort),简称快排,一种排序算法,最早由东尼·霍尔提出。在平均状况下,排序

n

个项目要

O(n log n)

次比较。在最坏状况下则需要

O (n²)

次比较,但这种状况并不常见。事实上,快速排序

O(n log n)

通常明显比其他算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地达成。其实这是分治法与递归结合实现的。

思想

  1. 原数组中,取出中间值

  2. 原数组剩下的每一项与中间值比较,小的放左边,大的放右边并和中间项拼接

  3. 左右两边数组递归此函数

  4. 直到原数组只剩下一项或空,停止递归循环

实现快速排序

说了这么多,还是没有图片看起来更加直观呀,那么就请看下面这张图吧!

Sorting_quicksort_anim.gif

下面请看 js 代码实现

let array = [3, 2, 1, 6, 9, 7, 8, 5]
function quickSort (arr){
    // 4 直到原数组只剩下一项或空
    if(arr.length<=1){
        return arr
    }
    
    // 1 原数组中,取出中间值
    let middleIndex = Math.floor(arr.length/2)
    let middleVal = arr.splice(middleIndex,1)[0]

    // 2 原数组剩下的每一项与中间值比较,小的放左边,大的放右边并和中间项拼接
    let leftArr = []
    let rightArr = []
    for (let i=0; i< arr.length; i++){
        let item = arr[i]
        item < middleVal ? leftArr.push(item) : rightArr.push(item)
    }
    
    // 3 左右两边数组递归此函数
    return  quickSort(leftArr).concat(middleVal,quickSort(rightArr))
}

console.log('quickSort(array): ', quickSort(array)); // [ 1, 2, 3, 5, 6, 7, 8, 9 ]

好了,希望今天的分享能让你有所收获,如果喜欢我的分享的话,请点赞收藏加转发,另外听说点赞的话代表朕已阅

作者:陈有味

联系方式: chenuvi@outlook.com

文章标题XXX | 创作者训练营 征文活动正在进行中......