www.2527.com_澳门新葡8455手机版_新京葡娱乐场网址_
做最好的网站

Javascript中的常见排序算法,javascript自然分类法算

2019-08-02 03:15 来源:未知

复制代码 代码如下:

切实代码及比较如下所示:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=7, IE=9, IE=10">
<meta name="viewport"
content="initial-scale=1, maximum-scale=1,user-scalable=no">
<title>自然分类法算法</title>
<script>
function getJenksBreaks(data,numclass) {
function sortNumber(a,b)//在javascript里,Array的sort方法,必须用那个函数,不然不是按数字大小排序
{
return a - b
}
// int numclass;
var numdata = data.length;
data.sort(sortNumber); //先排序

复制代码 代码如下:

var mat1=new Array();
var mat2=new Array();
var st=new Array();

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "; 
<html xmlns="" lang="gb2312"> 
<head> 
<title> 常见排序算法 之 JavaScript版 </title> 
<meta http-equiv="content-type" content="text/html; charset=gb2312" /> 
<meta name="keywords" content="排序,算法,JavaScript排序" /> 
<meta name="description" content="用JavaScript达成的广阔排序算法:冒泡排序,采取排序,插入排序,谢尔排序,急速排序(递归),快捷排序(仓库),归并排序,堆排序" /> 
<script type="text/javascript"> 
 Array.prototype.swap = function(i, j) 
 { 
 var temp = this[i]; 
 this[i] = this[j]; 
 this[j] = temp; 
 } 
 Array.prototype.bubbleSort = function() 
 { 
 for (var i = this.length - 1; i > 0; --i) 
 { 
 for (var j = 0; j < i;  j) 
 { 
 if (this[j] > this[j   1]) this.swap(j, j   1); 
 } 
 } 
 } 
 Array.prototype.selectionSort = function() 
 { 
 for (var i = 0; i < this.length;  i) 
 { 
 var index = i; 
 for (var j = i   1; j < this.length;  j) 
 { 
 if (this[j] < this[index]) index = j; 
 } 
 this.swap(i, index); 
 } 
 } 
 Array.prototype.insertionSort = function() 
 { 
 for (var i = 1; i < this.length;  i) 
 { 
 var j = i, value = this[i]; 
 while (j > 0 && this[j - 1] > value) 
 { 
 this[j] = this[j - 1]; 
 --j; 
 } 
 this[j] = value; 
 } 
 } 
 Array.prototype.shellSort = function() 
 { 
 for (var step = this.length >> 1; step > 0; step >>= 1) 
 { 
 for (var i = 0; i < step;  i) 
 { 
 for (var j = i   step; j < this.length; j  = step) 
 { 
 var k = j, value = this[j]; 
 while (k >= step && this[k - step] > value) 
 { 
 this[k] = this[k - step]; 
 k -= step; 
 } 
 this[k] = value; 
 } 
 } 
 } 
 } 
 Array.prototype.quickSort = function(s, e) 
 { 
 if (s == null) s = 0; 
 if (e == null) e = this.length - 1; 
 if (s >= e) return; 
 this.swap((s   e) >> 1, e); 
 var index = s - 1; 
 for (var i = s; i <= e;  i) 
 { 
 if (this[i] <= this[e]) this.swap(i,  index); 
 } 
 this.quickSort(s, index - 1); 
 this.quickSort(index   1, e); 
 } 
 Array.prototype.stackQuickSort = function() 
 { 
 var stack = [0, this.length - 1]; 
 while (stack.length > 0) 
 { 
 var e = stack.pop(), s = stack.pop(); 
 if (s >= e) continue; 
 this.swap((s   e) >> 1, e); 
 var index = s - 1; 
 for (var i = s; i <= e;  i) 
 { 
 if (this[i] <= this[e]) this.swap(i,  index); 
 } 
 stack.push(s, index - 1, index   1, e); 
 } 
 } 
 Array.prototype.mergeSort = function(s, e, b) 
 { 
 if (s == null) s = 0; 
 if (e == null) e = this.length - 1; 
 if (b == null) b = new Array(this.length); 
 if (s >= e) return; 
 var m = (s   e) >> 1; 
 this.mergeSort(s, m, b); 
 this.mergeSort(m   1, e, b); 
 for (var i = s, j = s, k = m   1; i <= e;  i) 
 { 
 b[i] = this[(k > e || j <= m && this[j] < this[k]) ? j  : k ]; 
 } 
 for (var i = s; i <= e;  i) this[i] = b[i]; 
 } 
 Array.prototype.heapSort = function() 
 { 
 for (var i = 1; i < this.length;  i) 
 { 
 for (var j = i, k = (j - 1) >> 1; k >= 0; j = k, k = (k - 1) >> 1) 
 { 
 if (this[k] >= this[j]) break; 
 this.swap(j, k); 
 } 
 } 
 for (var i = this.length - 1; i > 0; --i) 
 { 
 this.swap(0, i); 
 for (var j = 0, k = (j   1) << 1; k <= i; j = k, k = (k   1) << 1) 
 { 
 if (k == i || this[k] < this[k - 1]) --k; 
 if (this[k] <= this[j]) break; 
 this.swap(j, k); 
 } 
 } 
 } 
 function generate() 
 { 
 var max = parseInt(txtMax.value), count = parseInt(txtCount.value); 
 if (isNaN(max) || isNaN(count)) 
 { 
 alert("个数和最大值必须是三个卡尺头"); 
 return; 
 } 
 var array = []; 
 for (var i = 0; i < count;  i) array.push(Math.round(Math.random() * max)); 
 txtInput.value = array.join("n"); 
 txtOutput.value = ""; 
 } 
 function demo(type) 
 { 
 var array = txtInput.value == "" ? [] : txtInput.value.replace().split("n"); 
 for (var i = 0; i < array.length;  i) array[i] = parseInt(array[i]); 
 var t1 = new Date(); 
 eval("array."   type   "Sort()"); 
 var t2 = new Date(); 
 lblTime.innerText = t2.valueOf() - t1.valueOf(); 
 txtOutput.value = array.join("n"); 
 } 
</script> 
</head> 
<body onload="generate();"> 
<table style="font-size:12px;"> 
<tr> 
 <td align="right"> 
 <textarea id="txtInput" style="width:120px;height:500px;" readonly></textarea> 
 </td> 
 <td width="150" align="center"> 
 随机数个数<input id="txtCount" value="500" style="width:50px" /><br /><br /> 
 最大随机数<input id="txt马克斯" value="一千" style="width:50px" /><br /><br /> 
 <button onclick="generate()">重新生成</button><br /><br /><br /><br /> 
 耗时(毫秒):<label id="lblTime"></label><br /><br /><br /><br /> 
 <button onclick="demo('bubble');">冒泡排序</button><br /><br /> 
 <button onclick="demo('selection');">选用排序</button><br /><br /> 
 <button onclick="demo('insertion');">插入排序</button><br /><br /> 
 <button onclick="demo('shell');">谢尔排序</button><br /><br /> 
 <button onclick="demo('quick');">快捷排序(递归)</button><br /><br /> 
 <button onclick="demo('stackQuick');">快捷排序(饭馆)</button><br /><br /> 
 <button onclick="demo('merge');">归并排序</button><br /><br /> 
 <button onclick="demo('heap');">堆排序</button><br /><br /> 
 </td> 
 <td align="left"> 
 <textarea id="txtOutput" style="width:120px;height:500px;" readonly></textarea> 
 </td> 
</tr> 
</table> 
</body> 
</html> 

for (var j = 0; j <= numdata; j ){
mat1[j]=new Array();
mat2[j]=new Array();
st[j]=0;
for(var i=0;i<=numclass;i ){
mat1[j][i]=0;
mat2[j][i]=0;
}
}

快快排序, 插入排序, 希尔排序, 冒泡排序, quickSort, insertSort, shellSort, bubbleSort, javascript排序
说明 写那些非常重要是为着陶冶自身,并无实际意义。
每一个浏览器测量试验得出的数目会区别样。比如小编用chrome 测试一般飞快排序都会最快,IE 则依照数老董度有不小可能率Hill最快。
绝不用太大数目去测验冒泡排序(浏览器崩溃了本身随意)
即便有乐趣可以 下载测量检验页面

for (var i = 1; i <= numclass; i ) {
mat1[1][i] = 1;
mat2[1][i] = 0;
for (var j = 2; j <= numdata; j ){

**个人明白

mat2[j][i]=Number.MAX_VALUE;
}
}
var v=0;

**冒泡排序:最简便,也最慢,貌似长度小于7最优
插入排序: 比冒泡快,比火速排序和Hill排序慢,极小数码有优势
敏捷排序:这是贰个丰硕快的排序格局,V8的sort方法就应用高效排序和插入排序的结缘
Hill排序:在非chrome下数主任度小于一千,Hill排序比神速更加快
系统方法:在forfox下系统的那几个主意拾壹分快

for (var l = 2; l <= numdata; l ) {
var s1=0;
var s2=0;
var w=0;
var i3=0;
for (var m = 1; m <= l; m ) {
i3 = l - m 1;

算法源码

var val=parseInt(data[i3-1]);

复制代码 代码如下:

s2 = val * val;
s1 = val;

// ---------- 一些排序算法
// js 利用sort进行排序
systemSort:function(array){
return array.sort(function(a, b){
return a - b;
});
},
// 冒泡排序
bubbleSort:function(array){
var i = 0, len = array.length,
j, d;
for(; i<len; i ){
for(j=0; j<len; j ){
if(array[i] < array[j]){
d = array[j];
array[j] = array[i];
array[i] = d;
}
}
}
return array;
},
// 快捷排序
quickSort:function(array){
//var array = [8,4,6,2,7,9,3,5,74,5];
//var array = [0,1,2,44,4,324,5,65,6,6,34,4,5,6,2,43,5,6,62,43,5,1,4,51,56,76,7,7,2,1,45,4,6,7];
var i = 0;
var j = array.length - 1;
var Sort = function(i, j){
// 截至条件
if(i == j ){ return };
var key = array[i];
var stepi = i; // 记录开首地点
var stepj = j; // 记录停止地点
while(j > i){
// j <<-------------- 向前查找
if(array[j] >= key){
j--;
}else{
array[i] = array[j]
//i ------------>>向后寻找
while(j > i){
if(array[i] > key){
array[j] = array[i];
break;
}
}
}
}
// 要是第二个收取的 key 是纤维的数
if(stepi == i){
Sort( i, stepj);
return ;
}
// 最终多个空位留给 key
array[i] = key;
// 递归
Sort(stepi, i);
Sort(j, stepj);
}
Sort(i, j);
return array;
},
// 插入排序
insertSort:function(array){
//
//
//var array = [0,1,2,44,4,324,5,65,6,6,34,4,5,6,2,43,5,6,62,43,5,1,4,51,56,76,7,7,2,1,45,4,6,7];
var i = 1, j, step, key,
len = array.length;
for(; i < len; i ){
step = j = i;
key = array[j];
while(--j > -1){
if(array[j] > key){
array[j 1] = array[j];
}else{
break;
}
}
array[j 1] = key;
}
return array;
},
// Hill排序
//Jun.array.shellSort(Jun.array.df(10000));
shellSort:function(array){
//
// var array = [13,14,94,33,82,25,59,94,65,23,45,27,73,25,39,10];
var stepArr = [1750, 701, 301, 132, 57, 23, 10, 4, 1]; // reverse() 在维基上收看那几个最优的步长 异常的小数组
//var stepArr = [1031612713, 217378076, 45806244, 9651787, 2034035, 428481, 90358, 19001, 4025, 836, 182, 34, 9, 1]//针对大数组的增长幅度选拔
var i = 0;
var stepArrLength = stepArr.length;
var len = array.length;
var len2 = parseInt(len/2);
for(;i < stepArrLength; i ){
if(stepArr[i] > len2){
continue;
}
stepSort(stepArr[i]);
}
// 排序八个幅度
function stepSort(step){
//console.log(step) 使用的小幅度总计
var i = 0, j = 0, f, tem, key;
var stepLen = len%step > 0 ? parseInt(len/step) 1 : len/step;

w ;
v = s2 - (s1 * s1) / w;
var i4 = i3 - 1;
if (i4 != 0) {
for (var j = 2; j <= numclass; j ) {
if (mat2[l][j] >= (v mat2[i4][j - 1])) {
mat1[l][j] = i3;
mat2[l][j] = v mat2[i4][j - 1];

for(;i < step; i ){// 依次循环列
for(j=1;/*j < stepLen && */step * j i < len; j ){//依次循环每列的每行
tem = f = step * j i;
key = array[f];
while((tem-=step) >= 0){// 依次向上查找
if(array[tem] > key){
array[tem step] = array[tem];
}else{
break;
}
}
array[tem step ] = key;
}
}
}
return array;
}

if(l==200&&j==5) alert("l=" 200 ",j=" 5 ";mat2[200][5]=" mat1[l][j] "i3=" i3);
}
}
}
}

测量试验代码打包下载

mat1[l][1] = 1;
mat2[l][1] = v;
}

复制代码 代码如下: !DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""" html...

var k = numdata;
var kclass=new Array();

/* int[] kclass = new int[numclass]; */
kclass[numclass - 1] = parseInt(data[data.length-1]);
/* kclass[numclass - 1] = (Integer) data.get(data.size() - 1); */

for (var j = numclass; j >= 2; j--) {
var id = parseInt(mat1[k][j]) - 2;
kclass[j - 2] = parseInt( data[id]);
k = parseInt( mat1[k][j] - 1);
}

return kclass;
}

function doit(){
var data = new Array( 9, 9, 9, 9, 8, 1, 9, 7, 6, 7, 10, 7, 7, 8, 5, 7, 8, 2,
6, 6, 9, 10, 2, 2, 3, 9, 9, 1, 9, 1, 6, 7, 1, 9, 6, 5, 2, 8, 6,
6, 6, 4, 1, 4, 10, 9, 6, 9, 9, 7, 10, 9, 6, 6, 6, 9, 3, 2, 5,
10, 3, 9, 6, 1, 2, 1, 2, 7, 5, 2, 6, 6, 2, 7, 9, 9, 5, 4, 6, 4,
1, 1, 5, 1, 4, 4, 2, 6, 9, 7, 3, 10, 4, 4, 9, 5, 5, 3, 5, 3,
161, 136, 22, 113, 48, 114, 166, 33, 159, 182, 135, 22, 174,
191, 60, 176, 1, 155, 62, 142, 185, 84, 140, 27, 111, 176, 189,
24, 60, 29, 139, 20, 70, 172, 90, 120, 121, 173, 57, 138, 86,
180, 143, 155, 35, 10, 136, 158, 26, 29, 136, 97, 193, 194,
104, 147, 182, 44, 84, 139, 176, 16, 130, 168, 109, 182, 87,
78, 115, 75, 32, 88, 131, 168, 89, 25, 160, 60, 72, 92, 129,
159, 99, 5, 192, 6, 53, 15, 62, 176, 73, 129, 128, 34, 190, 95,
19, 19, 196, 30 );

/* var list = new Array();
for(int i = 0; i < data.length; i ){
list.add(data[i]);
} */
//Collections.sort(list);
var text=document.getElementById("text");
text.value="";
var grade = getJenksBreaks(data, 5);
for (var i = 0; i < grade.length; i )
text.value=text.value grade[i] ",";

}

</script>
</head>

<body >
<button type="button"onclick="doit()">自然分类法</button>

<input id="text"></input>
</body>
</html>

TAG标签:
版权声明:本文由澳门新葡8455手机版发布于Web前端,转载请注明出处:Javascript中的常见排序算法,javascript自然分类法算