[{"data":1,"prerenderedAt":67},["ShallowReactive",2],{"article-22":3},{"code":4,"msg":5,"data":6,"count":14},200,"查询成功",{"id":7,"title":8,"keywords":9,"description":10,"category_id":11,"content":12,"body_html":13,"thumb_up":14,"clicks":15,"sort":14,"remark":16,"status":17,"is_open":17,"is_deleted":14,"is_top":14,"is_recommend":14,"create_time":18,"update_time":19,"image_id":20,"url":13,"member_id":14,"cate_name":21,"prev":22,"next":25,"tags":28,"words":38,"read_time":39,"comments":14,"cover":40,"relevant":41},22,"JavaScript常见排序之快速排序","Javascript,排序,算法","将原问题分解为若干个规模更小但结构与原问题相似的子问题。 递归地解这些子问题，然后将这些子问题的解组合为原问题的解。",2,"##### 1、算法原理\n\n将原问题分解为若干个规模更小但结构与原问题相似的子问题。 递归地解这些子问题，然后将这些子问题的解组合为原问题的解。\n\n##### 2、排序流程\n\n（1）在数据集之中，选择一个元素作为” 基准” （pivot）。\n\n（2）所有小于” 基准” 的元素，都移到” 基准” 的左边；所有大于” 基准” 的元素，都移到” 基准” 的右边。 这个操作称为分区 (partition) 操作，分区操作结束后，基准元素所处的位置就是最终排序后它的位置。\n\n（3）对” 基准” 左边和右边的两个子集，不断重复第一步和第二步，直到所有子集只剩下一个元素为止。\n\n##### 3、实例分析\n\n举例来说，现有数组 arr = [3,7,8,5,2,1,9,5,4]，分区可以分解成以下步骤：\n\n（1）首先选定一个基准元素，这里我们元素 5 为基准元素（基准元素可以任意选择）：\n\n\n```bash\n    pivot\n      ↓\n3 7 8 5 2 1 9 5 4\n```\n（2）将基准元素与数组中最后一个元素交换位置，如果选择最后一个元素为基准元素可以省略该步：\n\n\n```bash\n              pivot\n                ↓\n3 7 8 4 2 1 9 5 5\n```\n（3）从左到右（除了最后的基准元素），循环移动小于基准元素 5 的所有元素到数组开头，留下大于等于基准元素的元素接在后面。\n在这个过程它也为基准元素找寻最后摆放的位置。 循环流程如下：\n循环 i == 0 时，storeIndex == 0，找到一个小于基准元素的元素 3，那么将其与storeIndex 所在位置的元素交换位置，这里是 3 自身，交换后将 storeIndex 自增 1，storeIndex == 1：\n\n\n```bash\n              pivot\n                ↓\n3 7 8 4 2 1 9 5 5\n↑\nstoreIndex\n```\n循环 i == 3 时，storeIndex == 1，找到一个小于基准元素的元素 4：\n\n```bash\n     ┌──────┐       pivot\n     ↓      ↓         ↓\n3    7 8    4 2 1 9 5 5\n     ↑      ↑\nstoreIndex  i\n```\n交换位置后，storeIndex 自增 1，storeIndex == 2：\n\n```bash\n              pivot\n                ↓\n3 4 8 7 2 1 9 5 5\n    ↑\nstoreIndex\n```\n循环 i == 4 时，storeIndex == 2，找到一个小于基准元素的元素 2：\n\n```bash\n    ┌───────┐     pivot\n    ↓       ↓       ↓\n3 4 8   7   2 1 9 5 5\n    ↑       ↑\nstoreIndex  i\n```\n交换位置后，storeIndex 自增 1，storeIndex == 3：\n\n```bash\n              pivot\n                ↓\n3 4 2 7 8 1 9 5 5\n      ↑\n storeIndex\n```\n循环 i == 5 时，storeIndex == 3，找到一个小于基准元素的元素 1：\n\n```bash\n      ┌───────┐   pivot\n      ↓       ↓     ↓\n3 4 2 7    8  1 9 5 5\n      ↑       ↑\n storeIndex   i\n```\n交换后位置后，storeIndex 自增 1，storeIndex == 4：\n\n```bash\n    pivot\n      ↓\n3 4 2 1 8 7 9 5 5\n        ↑\n   storeIndex\n```\n循环 i == 7 时，storeIndex == 4，找到一个小于等于基准元素的元素 5：\n\n```bash\n   ┌───────────┐ pivot\n   ↓           ↓   ↓\n3 4 2 1 8   7   9   5   5\n   ↑           ↑\n   storeIndex  i\n```\n交换后位置后，storeIndex 自增 1，storeIndex == 5：\n```bash\n    pivot\n      ↓\n3 4 2 1 5 7 9 8 5\n     ↑\n     storeIndex\n```\n（4）循环结束后交换基准元素和 storeIndex 位置的元素的位置：\n\n```bash\n   pivot\n     ↓\n3 4 2 1 5 5 9 8 7\n     ↑\n     storeIndex\n```\n那么 storeIndex 的值就是基准元素的最终位置，这样整个分区过程就完成了。\n\n引用维基百科图片\n\n![](https:\u002F\u002Ftp.myong.top\u002Fstorage\u002Fckeditor\u002F20190117\u002Ff5c87e18fe481c18e45cd482970d0ec4.png)\n##### 4、代码实现\n\n``` javaScript\nfunction quickSort(array) { \n   \u002F\u002F 交换元素位置\n    function swap(array, i, k) {\n        var temp = array[i];\n        array[i] = array[k];\n        array[k] = temp;\n    } \n    \u002F\u002F 数组分区， 左小右大\n    function partition(array, left, right) {\n        var storeIndex = left;\n        var pivot      = array[right]; \u002F\u002F 直接选最右边的元素为基准元素\n        for (var i = left; i \u003C right; i ++) {\n            if (array[i] \u003C pivot) {\n                swap(array, storeIndex, i);\n                storeIndex ++; \u002F\u002F 交换位置后， storeIndex 自增1， 代表下一个可能要交换的位置\n            }\n        }\n        swap(array, right, storeIndex); \u002F\u002F 将基准元素放置到最后的正确位置上\n        return storeIndex;\n    }\n    function sort(array, left, right) {\n        if (left > right) {\n            return;\n        }\n        var storeIndex = partition(array, left, right);\n        sort(array, left, storeIndex - 1);\n        sort(array, storeIndex + 1, right);\n    }\n    sort(array, 0, array.length - 1);\n    return array;\n}\nvar arr = [3, 7, 8, 5, 2, 1, 9, 5, 4];\nconsole.log(quickSort(arr));\n```",null,0,525,"",1,"2019-01-17 22:50:34","2026-04-19 15:14:27",140,"PHP",{"id":23,"title":24},21,"Cenos7.2下安装Apache2.4，MySQL5.7和PHP7.1",{"id":26,"title":27},23,"JavaScript常见算法排序之冒泡排序",[29,32,35],{"id":30,"name":31},42,"前端",{"id":33,"name":34},43,"Javascript",{"id":36,"name":37},44,"排序",1799,4,"https:\u002F\u002Ftp.myong.top\u002Fstorage\u002Farticle\u002Fa6\u002Fb893ca219d1ce6b4b96a91423a9b3f.jpg",[42,47,52,57,62],{"id":43,"title":44,"create_time":45,"description":46},93,"PHP执行Python脚本解压，压缩文件夹操作","2020-08-06 14:59:05","PHP是有解压缩类文件的，但在实际项目中，用户方使用Python脚本压缩，很容易出现中文解压乱码，导致文件内容丢失的情况，本文主要介绍PHP执行Python脚本解压缩出现的问题以及解决方法",{"id":48,"title":49,"create_time":50,"description":51},92,"PHP对图片的处理","2020-07-30 15:53:38","图片处理函数功能：缩放、剪切、相框、水印、锐化、旋转、翻转、透明度、反色处理并保存历史记录的思路：当有图片有改动时自动生成一张新图片",{"id":53,"title":54,"create_time":55,"description":56},96,"PHP中字符串跟0做比较永远是true","2021-02-04 16:16:27","最近在项目中做数据对比的功能，发现一个特殊的情况，0跟任何字符串做比较永远返回true，特意了解了一下。",{"id":58,"title":59,"create_time":60,"description":61},13,"Win系统下配置PHP链接Oracle","2019-01-17 22:23:36","该文章内容主要介绍window系统下，php连接oracle的配置。",{"id":63,"title":64,"create_time":65,"description":66},103,"面向对象三大特性五大原则 + 低耦合高内聚[转载]","2021-10-31 23:18:58","面向对象的三大特性是\"封装、\"多态\"、\"继承\"，五大原则是\"单一职责原则\"、\"开放封闭原则\"、\"里氏替换原则\"、\"依赖倒置原则\"、\"接口分离原则\"。",1783431670430]