js 常用排序整理
排序:
1. 内部排序:
(1). 交换排序:
1). 冒泡排序 稳定
一次比较相邻两个元素的大小,顺序错误的,将其位置互换
(从高位到低位 或者 从低位到高位)
初始版:
var array = [6, 5, 3, 1, 8, 7, 2, 4],
length = array.length,
temp = '';
for (var i=0; i<length-1; i++) {
for (var j=0; j<length-i-1; j++) {
if (array[j]>array[j+1]) {
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
console.log(array)
改进版(定义标志变量记录每次最后一次交换的位置索引,此标志变量之后的元素都已交换完成,故再次循环的时候只进行到标记变量的位置比较即可)
var array = [6, 5, 3, 1, 8, 7, 2, 4],
temp = '',
i = array.length - 1;
while (i > 0) {
let pos = 0;
for (let j = 0; j < i; j++) {
if (array[j] > array[j + 1]) {
pos = j;
let temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
i = pos;
}
console.log(array)
鸡尾酒(定向冒泡排序)(从高位到低位的同时也从低位到高位)
var array = [6,5,3,1,8,7,2,4],
length = array.length,
temp = '',
left = 0,
right = length-1;
while (left<right) {
for (var i=0; i<right; i++) {
if (array[i]>array[i+1]) {
temp = array[i];
array[i] = array[i+1];
array[i+1] = temp;
}
}
right--;
for (var i=right; i>left; i--) {
if (array[i]<array[i-1]) {
temp = array[i];
array[i] = array[i-1];
array[i-1] = temp;
}
}
left++;
}
console.log(array)
2). 快速排序 不稳定
1. 取数组中间索引(pivotIndex)
2. 去数组中间位置元素(pivot = Number(array.splice(pivotIndex, 1)))
3. 新建两个空数组left, right
4. 循环跟数组中间元素比较,大的放right,小的放left
5. 递归回调: 对left,right 分别递归回调形成有序的数组后
6. 最后,将有序的left pivot right 三部分 concat 起来
var array = [6,5,3,1,8,7,2,4];
function quickSort(array) {
if (array.length <= 1) {
return array;
}
const pivotIndex = parseInt(array.length / 2);
const pivot = Number(array.splice(pivotIndex, 1));
const left = []; const right = [];
for (let i = 0; i < array.length; i++) {
if (array[i] < pivot) {
left.push(array[i]);
} else {
right.push(array[i]);
}
}
return quickSort(left).concat([pivot], quickSort(right));
};
console.log(array)
(2). 插入排序:
1). 直接插入排序 稳定
1. 取无序序列的第一个最为有序序列
2. 从第二个开始抓取,从有序序列的末尾开始向前找
3. 如果 比较到的元素(有序序列中的元素)(array[j]) > 被比较的元素(要插入的元素)(key),则 将前者向后移动一个位置(array[j+1] = array[j])
4. 如果 比较到的元素(有序序列中的元素)(array[j]) >= 被比较的元素(要插入的元素)(key),则 将后者放置前者的下一个位置处(array[j+1] = key)
var array = [6,5,3,1,8,7,2,4];
for (let i = 1; i < array.length; i++) {
let key = array[i];
let j = i - 1;
while (j >= 0 && array[j] > key) {
array[j + 1] = array[j];
j--;
}
array[j + 1] = key;
}
console.log(array)
2). 二分法插入排序
1. 取无序序列第一个元素作为有序序列(即有序序列的起始)(有序序列:array[0]~array[i-1])
2. 取下一个元素(array[i])作为被插入元素并做记录为 key
3. 取有序序列的开始及结束位置的索引分别为 left 和 right
4. 取有序序列的中间索引为 middle= Math.floor((left+right)/2)
5. 将 middle 位置的元素 array[middle] 与 被插入元素 key 比较,
如果 key > array[middle],便置 left = middle+1,
反之 key > array[middle] ,则置 right = middle-1,
直至 right < left 为止
(此步骤为 二分查找 原理)
6. 对从 left 到 key值元素所在位置索引 i-1 处之间的有序序列 array[left]~array[i-1] 与 key 两者之间采用 直接插入法 进行插入
7. 重复以上步骤 2~6
var array = [6,5,3,1,8,7,2,4];
for (let i = 1; i < array.length; i++) {
let key = array[i], left = 0, right = i - 1;
//console.log(i+'++'+key);
//console.log(left+'=='+right);
while (left <= right) {
let middle = parseInt((left + right) / 2);
//console.log(left+'=='+middle+'=='+right)
if (key < array[middle]) {
right = middle - 1;
} else {
left = middle + 1;
}
//console.log(left+'=='+right)
}
//console.log(array)
for (let j = i - 1; j >= left; j--) {
array[j + 1] = array[j];
//console.log(array)
}
array[left] = key;
//console.log(array)
}
console.log(array)
3). 希尔排序 不稳定
不太理解
var arr=[49,38,65,97,76,13,27,49,55,4],
len=arr.length;
for(var fraction = Math.floor(len/2);fraction>0;fraction = Math.floor(fraction/2)){
for(var i=fraction;i<len;i++){
for(var j=i-fraction;j>=0&&arr[j]>arr[fraction+j];j-=fraction){
var temp=arr[j];
arr[j]=arr[fraction+j];
arr[fraction+j]=temp;
}
}
}
console.log(arr);
(3). 选择排序:
1). 简单选择排序 不稳定
1. 取序列的第一个元素作为有序序列,并取该序列末尾索引位置为作参照,minIndex=0
2. 从序列的第二个元素开始与 array[minIndex] 做比较,如果小就记该元素位置索引为 minIndex,
3. 重复操作步骤2 直至再无更小元素为止,将此时的 minIndex 与有序序列的末尾元素互换
(先从未排序序列中找出最小(大)元素,将该最小元素与序列的起始位置交换,至此 最小元素即到了有序元素的起始位置,
然后 再从剩余的未排序序列中继续寻找最小(大)元素,依次与未排序序列中的起始位置互换,至此 次大的元素就依次放到了有序序列的末尾)
var array = [6,5,3,1,8,7,2,4],
length = array.length;
for (let i = 0; i < length - 1; i++) {
let minIndex = i;
console.log(array[minIndex]);
for (let j = i + 1; j < length; j++) {
if (array[j] < array[minIndex]) {
minIndex = j;
}
}
let temp = array[i];
array[i] = array[minIndex];
array[minIndex] = temp;
console.log(array);
}
console.log(array)
2). 堆排序 不稳定
(4). 归并排序: 稳定
1). 递归原理
1. 利用递归将数组对半开分为 left,right 两个数组,直到每个拆分完的数组中只有一个元素为止,将每个数组视为有序数组
2. 创建一个新的数组 newArray 来放排好序的元素
3. 从每个数组的第一个元素开始拿来比较,往newArray里放,小的先放,大的后放
注:步骤1 是递归进最里层,步骤3 是递归往外出,最后得到有序序列
function mergeSort(array) {
if (array.length < 2) {
return array;
}
const middle = parseInt(array.length / 2);
const left = array.slice(0, middle);
const right = array.slice(middle);
return merge(mergeSort(left), mergeSort(right));
}
function merge(left, right) {
const newArray = [];
while (left.length && right.length) {
if (left[0] <= right[0]) {
newArray.push(left.shift());
} else {
newArray.push(right.shift());
}
}
while (left.length) {
newArray.push(left.shift());
}
while (right.length) {
newArray.push(right.shift());
}
return newArray;
}
2). 基数排序: 稳定
2. 外部排序:
(1). 计数排序 稳定
(2). 桶排序 稳定
http://www.cnblogs.com/eniac12/p/5329396.html
http://www.cnblogs.com/eniac12/p/5332117.html
http://www.jianshu.com/p/96f5c19e13df
js 常用排序整理的更多相关文章
- js常用函数整理
类型转换:parseInt\parseFloat\toString 类型判断:typeof;eg:if(typeof(var)!="undefined")\isNaN 字符处理函数 ...
- js常用代码整理
引用js <script type="text/javascript" src="js/jquery-1.11.2.min.js"></scr ...
- js 常用排序
1. 冒泡排序 原理:从第一个元素开始,把当前元素和下一个索引元素进行比较.如果当前元素大,那么就交换位置,重复操作直到比较到最后一个元素 function bubbleSort(arr) { if ...
- js常用正则整理
个人博客: http://mcchen.club //校验是否全由数字组成 function isDigit(s) { var patrn=/^[0-9]{1,20}$/; if (!patrn.ex ...
- js 常用的比较排序算法总结
每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 一直很惧怕算法,总是感觉特别伤脑子,因此至今为止,几种基本的排序算法一直都不是很清楚, ...
- js数组学习整理
原文地址:js数组学习整理 常用的js数组操作方法及原理 1.声明数组的方式 var colors = new Array();//空的数组 var colors = new Array(3); // ...
- Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法
Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排 ...
- JS正则表达式大全(整理详细且实用)
JS正则表达式大全(整理详细且实用).需要的朋友可以过来参考下,希望对大家有所帮助!! 正则表达式中的特殊字符 字符 含意 \ 做为转意,即通常在"\"后面的字符不按原来意义解释, ...
- JS常用的标准函数
原文:JS常用的标准函数 1.Array类型函数 array.concat(item...) 函数功能:关联数组,实现数组相加功能,但并不影响原先数组,concat返回新数组. array.join( ...
随机推荐
- redux超易学三篇之二(开始使用react-redux)
其实 redux 真正让人感到混乱的还是在 react-redux 的使用中. 请配合完整代码参考~:完整源代码 也不是说混乱,主要是网上 推崇 最佳实践.学习一个新东西的时候,本来就很陌生,上来就用 ...
- 原生JS实现返回顶部和滚动锚点
;(function (window,doc,undefined) { function rollingAnchor(){ this.timer =''; } rollingAnchor.protot ...
- Python web前端 02 CSS
Python web前端 02 CSS 一.选择器 1.CSS的几种样式(CSS用来修饰.美化网页的) #建立模板 复制内容--->SETTING---> Editor -----> ...
- cenos安装erlang
https://blog.zfanw.com/install-erlang-on-centos/
- 最近研究了一个.NET的DHT网络搜索引擎,顺便重新整理了下引擎思路,供大家分享讨论下。
最近研究了一个.NET的DHT网络搜索引擎,顺便重新整理了下引擎思路,供大家分享讨论下.
- HDU - 1427 / UESTC - 1252 经典dfs
很好奇为什么hzwer那种稍改一下还是无法过样例,代码我没看出问题 换了一种用桶组合挑取两个数不断回溯的做法 这是HDU1427的代码,后者改一改就行了 #include<bits/stdc++ ...
- Apache Shiro(二)-登录认证和权限管理数据库操作
数据库支持 在上一篇中使用ini 配置文件进行了相关权限数据的配置. 但是实际工作中,我们都会把权限相关的内容放在数据库里. 所以本知识点讲解如何放在数据库里来撸. RBAC 概念 RBAC 是当下权 ...
- linux下解压rar文件
由于,linux系统内置没有这个包需要,我们用源码,添加到系统 Linux下rar unrar的安装 以3.8.0版本为例,如果是64位平台,执行以下命令,也可以去官方网站:)下载最新版:wget h ...
- QQ互联 网站应用接入
1.准备工作 接入qq登陆前,网站需要先进行申请,获得对应的appid和appkey, 以保证后续流程中可正确对网站与用户进行授权. 2.放置qq登陆按钮. 在网站页面上放置“qq登录”按钮,并为按钮 ...
- Oracle Pipelined Table Functions简介
转自: http://www.linuxidc.com/Linux/2011-05/35797.htm //概况 //基本上,当你希望一个PLSQL(或者java或者c)程序作为数据源,而不是表, ...