JS数组——冒泡、插入、快速排序
前言:因为要对后端返回来的数据进行处理,之前之后冒泡,不够用,去看了插入跟快速,写下这篇笔记。
使用背景:
1.冒泡排序
数据比较少,小于1000
2.插入排序
数据比较少,大于1000不推荐
3.快速排序
相对于前两者,适合处理量大的数据
一: 冒泡排序
主要思想:将每个数跟数组中的其他数两两比较大小,交换位置。
var arr = [1,5,10,15,100,25,50] // 需要注意,想要完成冒泡排序,需要两轮for循环
for (var i = 0; i < arr.length; i++) {
// 拿到每个数arr[i],再去遍历 i 后面的数去做比较
for (var j = i + 1; j < arr.length; j++) {
// 比较大小
// 升序
if (arr[i] > arr[j]) {
var tmp = arr[i]
arr[i] = arr[j]
arr[j] = tmp
}
}
} console.log(arr) // [1, 5, 10, 15, 25, 50, 100]
其他应用: 数组存储的是对象,利用arr[i].value 去比较
关键点: 控制循环次数,i是数组的长度,j是从i的位置+1开始,因为前面的数值已经排好了
可以优化的点: 假设数组本身就是排序好的,这时候再去比较大小就很不合理,设置标识
二、插入排序
主要思想:
1.把数组分成一个有序数列和一个无序数列
2.默认把数组第一项当成一个有序数列
3.拿第一项去跟其他无序项比较大小
4.调换位置
别光想,有点绕很正常的,有手写一下过程
三、快速排序(重点,面试比较多?)
主要思想:
1.随机用数组的其中一个值当基准值(中间值、中介、中线),我喜欢用数组第一项
2.left等于0,right等于数组的长度-1,从左往右
举个例子:
var arr = [5,3,6,2,7,9,10]
// 假设中间值是数组第一项 5
// 那我们想要的数组应该是这样的
arr = [2,3,5,6,7,9,10]
// 以 5 为中介,左边比5小或者等于,右边比5大或者等于
用代码实现
var arr = [5,3,2,4,6,9,7,10]
function quickSort(arr, i, j) {
var left = i
var right = j
if (left < right) {
//如果数组有两项以上
var base = arr[left]
// 设置中间值,开始比较
while (left !== right) {
// 这里是找比中间值小的值并设置
while (right > left && arr[right] >= base) {
// 假设此时right = 4
// right-- = 3 arr[left] = arr[3] = 4,这个时候再出去while判断,条件已经不成立了,我们也拿到了比base小的值了
right--
arr[left] = arr[right]
}
// 这里是找比中间值大的值并设置
while (left < right && arr[left] <= base) {
left++
arr[right] = arr[left]
}
}
// 设置中间值的位置
arr[right] = base
// 递归调用,直到数列别分解成一个数值组成的数列
arguments.callee(arr, i, left-1)
arguments.callee(arr, right+1, j)
return arr
}
}
console.log(quickSort(arr, 0, arr.length-1)
JS数组——冒泡、插入、快速排序的更多相关文章
- js数组冒泡
var arr 1= [1, 2, 3, 4, 5]; 最简单的 每组数字之间用逗号隔开 第一个数的索引值为0.数字为1 以此类推 中括号的内容是存var arr2 = Array(1, 2, 3); ...
- js数组冒泡排序,快速排序的原理以及实现
冒泡排序: 随便从数组中拿一位数和后一位比较,如果是想从小到大排序,那么就把小的那一位放到前面,大的放在后面,简单来说就是交换它们的位置,如此反复的交换位置就可以得到排序的效果. var arr = ...
- js数组冒泡排序、快速排序、插入排序
1.冒泡排序 //第一种 function bubblesort(ary){ for(var i=0;i<ary.length-1;i++){ for(var j=0;j<ary.leng ...
- 如何在JS数组特定索引处指定位置插入元素?
如何在JS数组特定索引处指定位置插入元素? 需求: 将一个元素插入到现有数组的特定索引处.听起来很容易和常见,但需要一点时间来研究它. // 原来的数组var array = ["one&q ...
- js 给json添加新的字段,或者添加一组数据,在JS数组指定位置删除、插入、替换元素
JS定义了一个json数据var test={name:"name",age:"12"};需要给test再添加一个字段,需要什么办法,可以让test的值为{na ...
- 数组的操作。1,JS数组去重。2,把数组中存在的某个值,全部找出来。3在JS数组指定位置插入元素。。。
1,数组去重 let arr = [1,2,3,4,5,6,1,2,3,'a','b','a']; let temp = []; // 作为存储新数组使用 for(let i = 0; i < ...
- js向一个数组中插入元素的几个方法-性能比较
向一个数组中插入元素是平时很常见的一件事情.你可以使用push在数组尾部插入元素,可以用unshift在数组头部插入元素,也可以用splice在数组中间插入元素. 但是这些已知的方法,并不意味着没有更 ...
- js数组快速排序/去重
数组的排序 快速排序 思路: (1)在数据集之中,选择一个元素作为”基准”(pivot). (2)所有小于”基准”的元素,都移到”基准”的左边:所有大于”基准”的元素,都移到”基准”的右边. (3) ...
- js数组操作大全
原文(http://www.cnblogs.com/webhotel/archive/2010/12/21/1912732.html) 用 js有很久了,但都没有深究过js的数组形式.偶尔用用也就是简 ...
随机推荐
- 【手势交互】8. Nimble Sense
早在2012.2013年度,手势识别领域就发生了几起重要的行业并购.比方英特尔对Omek的收购,谷歌对Flutter的收购.而苹果公司更是以3.45亿美金得高价收购了之前为微软Kinect提供技术支持 ...
- asp.net forms认证
工作中遇到的asp.net项目使用forms认证.以前虽然用过,但其原理并不了解,现在甚至对什么是form认证也完全不知道了.对一样东西如果不清楚其原理,不知其所以然,那么死记硬背是无济于事的. as ...
- Codeforces 802 补题
codeforces802 A-O Helvetic Coding Contest 2017 online mirror A Heidi and Library (easy) 水题 同B #incl ...
- 第十二周 Leetcode 354. Russian Doll Envelopes(HARD) LIS问题
Leetcode354 暴力的方法是显而易见的 O(n^2)构造一个DAG找最长链即可. 也有办法优化到O(nlogn) 注意 信封的方向是不能转换的. 对第一维从小到大排序,第一维相同第二维从大到小 ...
- 第九周 Leetcode 502. IPO (HARD)
Leetcode 502 一个公司 目前有资产W 可以选择实现K个项目,每个项目要求公司当前有一定的资产,且每个项目可以使公司的总资产增加一个非负数. 项目数50000 设计一个优先队列,对于当前状态 ...
- ORACLE获取某个时间段之间的月份列表和日期列表
ORACLE获取某个时间段之间的月份列表获取某个时间段之间的月份列表(示例返回2009-03到2010-03之间的月份列表) SELECT TO_CHAR(ADD_MONTHS(TO_DATE('20 ...
- Y-C
1.asp.net服务控件生命周期 11个生命阶段 (1)初始化: 初始化在传入Web请求生命周期内所需的设置,.跟踪视图状态.页面框架通过默认方式引发Init事件,并调用OnInit()方法,控件开 ...
- Window对象与DOM
目前,前端插件数不胜数,比如有移动端滑动特效插件Swiper,下拉刷新的iScroll,弹出框插件layer,还有我们经常使用的JQuery,jquery.mobile等,这些插件能够满足我们日常的基 ...
- Hbase源码分析:server端RPC
server端rpc包括master和RegionServer.接下来主要梳理一下,master和regionserver中有关rpc创建,启动以及处理的过程. 1,server rpc的初始化过程 ...
- [ CQOI 2014 ] 数三角形
\(\\\) Description 求 \(N\times M\) 的网格图上有多少个格点构成的三角形. 当三点共线的时候我们不认为这是一个三角形. \(n,m\le 10^4\) \(\\\) S ...