JS排序算法之快速排序(原地排序和非原地排序)
描述
选中数组中的一个数当标识,让这个数组中左边的数都比这个数小,右边的元素都比这个元素大。
充分利用比较行为。
先把大数组排好序,再排小数组
正好与 归并排序 相反
代码
非原地排序
参考 阮一峰快速排序
//非原地排序
function quickSort1(arr) {if (arr.length <= 1) return arr;let pivot = arr.splice(Math.floor(arr.length / 2), 1)[0];let left = [];let right = [];for (let i = 0; i < arr.length; i++) {if (arr[i] < pivot) left.push(arr[i])else right.push(arr[i])}return quickSort1(left).concat([pivot], quickSort1(right));
}
原地排序
就是将数组看成三部分,
第一部分是小于标识的元素,left下标表示第一部分的末尾
第二部分是等于标识的元素,left(不包括)与mid(不包括)中间的元素是等于标识的元素
第三部分是大于标识的元素,mid右边的元素是大于标识的元素
//原地排序
function quickSort(arr, l, r) {//若左下标大于或等于右下标,没必要排序了,直接返回if (l < r) {let left = l - 1;//mid永远标识还未进行比较的元素let mid = llet right = r;//选择的标识是数组的最后一项let pivot = arr[r]while (mid < right) {//元素小于标识,往第一部分添加元素if (arr[mid] < pivot) {swap(arr, ++left, mid++)}//元素大于标识,往第三部分添加元素else if (arr[mid] > pivot) {//之所以是--right是因为标识是最后一个元素,所以不用比较swap(arr, --right, mid)} else {//元素等于标识,往第二部分添加元素,直接mid+1就好了mid++;}}//这一轮排序结束,将标识换到中间swap(arr, mid, r);//继续排序左边数组quickSort(arr, l, left);//继续排序右边数组quickSort(arr, mid + 1, r);} else {return}
}//交换函数
function swap(arr, i, j) {let t = arr[i];arr[i] = arr[j]arr[j] = t
}
若还是不理解可以看B站 左程云 的算法视频,在第二个视频中有讲解(用的是java)。
JS排序算法之快速排序(原地排序和非原地排序)相关推荐
- 十大排序算法之快速排序(两种方法)
十大排序算法之快速排序 本文采用Java书写选择排序,其他语言类似可以借鉴着写 思想:在待排序序列中选择一个分割元素,将待排序序列中所有比分割元素关键字小的元素移动到分割元素左侧位置:将待排序序列中所 ...
- php1到5000排序,常用的排序算法(一)--快速排序(PHP实现)
常用的排序算法系列 快速排序 假设当前需要从小到大进行排序,快速排序的核心思路是,从当前数组中,找到一个元素作为基准比较值(key),分别从两个方向进行比较.从后往前找,比key小元素放在数组前面.然 ...
- 排序算法-04快速排序(Python实现)
快速排序 性质 一种基本的交换排序算法,比较常用的排序算法,简称快排. 基本的排序思路如下.基本思想为:通过一趟排序将要排序的数据分割成独立的两部分,分割点左边的数都比它小,分割点右边的数都比它大,然 ...
- 排序算法之----快速排序(快速上手快速排序)
排序算法之----快速排序(快速上手快速排序) 何为快速排序算法? 快速排序的基本思想又是什么? 其实很简单: 快速排序的基本思想是 1.先从数列中取出一个数作为基准数(这里我们的算法里面取数组最右边 ...
- 排序算法(5)快速排序
排序算法(5)快速排序 思想:递归,分治法. 1.先从数列中取出一个数作为基准数. 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边. 3.再对左右区间重复第二步,直到各区 ...
- 《数据结构与算法》(二十五)- 排序算法:快速排序
目录 前言 1. 快速排序 1.1 快速排序算法 1.2 快速排序算法复杂度分析 1.3 快速排序优化 2. 总结 原文地址:https://program-park.github.io/2021/1 ...
- 九大内部排序算法(快速排序、归并排序、堆排序、希尔排序、基数排序)
排序(Sorting)是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列. 文章目录 由于待排序的记录数量不同,使得排序过程中涉及的存储器 ...
- 【排序算法】快速排序(C语言)
[排序算法]-- 快速排序 目录 一.快速排序的单趟排序 1. 霍尔法 2. 挖坑法 3. 前后指针 二.快速排序 1. 排序步骤 2. 排序完整步骤图 3. 快速排序代码 3.1 递归实现 3.2 ...
- 【轻松学排序算法】眼睛直观感受几种常用排序算法(转)
1 快速排序 介绍: 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通 ...
- python实现希尔排序算法_排序算法总结(冒泡排序、直接插入排序、希尔排序)(python实现)...
其实本文叫排序算法总结有点过了,只是用python实现了一遍.本文都是参照一篇csdn博客<数据结构排序算法>,里面详细介绍每种排序算法的原理,并给出了C++的实现,再次膜拜. # -*- ...
最新文章
- 自动化测试和测试自动化的区别
- 创建型模式-工厂模式
- 基于Qt\C++实现的网络远程控制系统
- CM: word template web service schema number的限制
- Vue 是如何用 Rollup 打包的?
- rest_framework06:自动生成路由\action使用\认证
- Android之查看网络图片和网页HTML
- 剑指offer之替换空格
- Vue 移动端 股票 分时 K线
- win10把用户中文名改为英文名
- C语言中EOF是什么意思? linux 【转载】 2020-11-19
- C#中TransactionScope的使用小结
- 计算机专业必读哪两本经典书籍?
- jdk8的ConcurrentHashMap实现
- 为自己选一个网络硬盘
- Python爬虫 | 以滑雪为例演示大众点评商铺信息采集!
- tp5 分页之无刷新页面渲染
- list和set集合的遍历
- html5怎能编写播放器代码,HTML5应用-实现简单播放器的示例代码分享
- 每天一个效果 :(14)抽奖器功能