js排序算法,望路英雄不吝赐教

打字员 2011-03-04 10:13:22
这两天没什么事,就把算法重新温习了一下,下面有写好的程序,希望对算法有研究的同志们多多指点,看哪里有问题,要改正或改进的地方。

如果是对算法本身的原理理解有误,也望不要吝惜你的笔墨。。。。。

很抱歉的一点是没写注释


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>排序</title>
</head>
<body>
<script type="text/javascript">
/******************************生成乱序数组****************************/
var list = [];
for(var i = 0; i < 999; i++) {
list.push(parseInt(Math.random() * 10000));
}

/*****************************快速排序*******************************/
function quickSort(arr) {
(function(arr, s, e) {
var f = arguments.callee;
if(s < e) {
var i = s;
var j = e;
var key = arr[s];
while(i < j) {
if(arr[j] >= key) {
j--;
} else {
arr[i] = arr[j];
i++;
while(i < j) {
if(arr[i] > key) {
arr[j] = arr[i];
break;
} else {
i++;
}
}
}
}
arr[i] = key;
f(arr, s, i - 1);
f(arr, i + 1, e);
}
})(arr, 0, arr.length - 1);
}

/*****************************直接插入排序****************************/
function insertSort(arr) {
var len = arr.length;
var i, j, key;
for(i = 0; i < len; i++) {
j = i + 1;
key = arr[j];
if(key < arr[i]) {
while(key < arr[i]) {
arr[i + 1] = arr[i];
i--;
}
arr[i + 1] = key;
}
i = j - 1;
}
}

/********************************希尔排序(直接插入排序变种方法)**********************************/
function sellSort(arr) {
var len = arr.length;
var s = (len % 2) == 0? len : len + 1;
var k = 0;
while(s >= 1) {
k = len - s + 1;
/******************直接插入***********************/
var i, j, key;
for(i = 0; i < k; i++) {
j = i + 1;
key = arr[j];
if(key < arr[i]) {
while(key < arr[i]) {
arr[i + 1] = arr[i];
i--;
}
arr[i + 1] = key;
}
i = j - 1;
}
/******************直接插入***********************/
s = s / 2;
}
}

/********************************冒泡排序**********************************/
function bubbleSort(arr) {
var len = arr.length;
var key, flag;
while(true) {
flag = false;
for(var j = 0; j < len; j++) {
if(arr[j] > arr[j + 1]) {
key = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = key;
flag =true;
}
}
if(!flag) {
break;
}
}
}

/********************************直接选择排序**********************************/
function selectSort(arr) {
var len = arr.length;
var j, key;
for(var i = 0; i < len; i++) {
j = i + 1;
while(j < len) {
if(arr[j] < arr[i]) {
key = arr[i];
arr[i] = arr[j];
arr[j] = key;
}
j++;
}
}
}

/********************************堆排序************************************/
function heapSort(arr) {
var len = arr.length;
var wi = len - 1;
var key;
while(wi > 0) {
heap(arr, 0, wi);
key = arr[wi];
arr[wi] = arr[0];
arr[0] = key;
wi--;
}

/********************创建堆***********************/
function heap(arr, s, e) {
var len = arr.length;
var index = 0;
var i, j, key;
while(index < len) {
var i = index * 2 + 1;
var j = index * 2 + 2;
if(i <= len && arr[index] < arr[i]) {
key = arr[i];
arr[i] = arr[index];
arr[index] = key;
continue;
}
if(j <= len && arr[index] < arr[j]) {
key = arr[j];
arr[j] = arr[index];
arr[index] = key;
continue;
}
index++;
}
}
/********************创建堆***********************/
}

/********************************归并排序**********************************/
function mergeSort(arr) {
(function(arr, s, e) {
var f = arguments.callee;
var m;
if(s < e) {
m = Math.floor((s + e) / 2);
f(arr, s, m);
f(arr, (m + 1), e);
/*********************************************/
var b1 = s;
var e1 = m;
var b2 = m + 1;
var e2 = e;
var temp = [];
while(b1 <= e1 && b2 <= e2) {
if(arr[b1] < arr[b2]) {
temp.push(arr[b1]);
b1++;
} else {
temp.push(arr[b2])
b2++;
}
}
while(b1 <= e1) {
temp.push(arr[b1]);
b1++;
}
while(b2 <= e2) {
temp.push(arr[b2]);
b2++;
}
var l = temp.length;
for(var i = 0; i < l; i++) {
arr[s + i] = temp[i];
}
/*********************************************/
}
})(arr, 0, arr.length - 1);
}

/**********************************基数排序(从右到左)***************************************/
function radixSort(arr) {
Number.prototype.length = function() {
return this.toString().length;
}
Number.prototype.index = function(n) {
var l = this.length();
return l >= n? this.toString().substr(l - n, 1) : 0;
}

var maxLen = arr[0].length();
var len = arr.length;
var lenTemp = 0;
for(var i = 1; i < len; i++) {
lenTemp = arr[i].length();
if(lenTemp > maxLen) {
maxLen = lenTemp;
}
}

var temp, tempLen, itemTemp, key, ai;
for(var j = 1; j <= maxLen; j++) {
temp = [[], [], [], [], [], [], [], [], [], []];
for(var k = 0; k < len; k ++) {
itemTemp = arr[k];
key = itemTemp.index(j);
temp[key].push(itemTemp);
}
ai = 0;
for(var m = 0; m < 10; m++) {
tempLen = temp[m].length;
if(tempLen > 0) {
for(var n = 0; n < tempLen; n++) {
arr[ai] = temp[m][n];
ai++;
}
}
}
}
}

/**********************************数组sort排序***************************************/
function arrSort(arr) {
arr.sort(function(a, b) {
return a > b? true : false;
});
}

var st = (new Date()).getTime();
/********************************************************/
//quickSort(list);
//insertSort(list);
//sellSort(list);
//bubbleSort(list);
//selectSort(list);
//mergeSort(list);
//radixSort(list);
//arrSort(list);
/********************************************************/
var et = (new Date()).getTime();
document.write(list);
alert(et - st);
</script>
</body>
</html>

...全文
273 8 打赏 收藏 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
打字员 2011-03-04
  • 打赏
  • 举报
回复
是为了学习原理,拓宽思维。。。

而且最后一个排序方法不就是你说的sort()

汉尼拔 2011-03-04
  • 打赏
  • 举报
回复
为什么不用js自带的排序?
Array.sort(function(){})

这样的效率不高?
Cool_xiaocao 2011-03-04
  • 打赏
  • 举报
回复
aj3423 2011-03-04
  • 打赏
  • 举报
回复
谁知道 [].sort 这种是用的什么排序法
囧 2011-03-04
  • 打赏
  • 举报
回复
kaifadi 2011-03-04
  • 打赏
  • 举报
回复
没事测了下效率,用FF测试了10万条数据,参考值:结果为:
//quickSort(list); //695
//insertSort(list);//stop表示脚本停止响应
//sellSort(list); //stop
//bubbleSort(list);//STOP
//selectSort(list); //STOP
//mergeSort(list); //1600
//radixSort(list); //1500
//arrSort(list); //854
kaifadi 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 danica7773 的回复:]

是为了学习原理,拓宽思维。。。

而且最后一个排序方法不就是你说的sort()
[/Quote]
说改进说不上。这些都是前人总结下来的精华,以前楼主好象发过一次类似的帖子。该类帖肯定有。但是我不记得是具体哪天了。
内容概要:本文详细介绍了利用Matlab代码实现分数阶系统(FOS)Lyapunov指数谱的计算方法,涵盖分数阶Lorenz系统、4D分数阶Chen系统和分数阶Duffing振荡器三类典型非线性动力学系统。通过数值仿真手段,系统地分析了不同分数阶微分阶次下系统的混沌演化行为与稳定性特征,重点阐述了Lyapunov指数谱的求解算法流程、关键实现步骤及参数设置策略,为深入研究分数阶系统的复杂动力学特性提供了可靠的数值分析工具与技术路径。; 适合人群:具备非线性动力学、分数阶微积分理论基础及Matlab编程能力的研究生、高校教师、科研机构研究人员以及从事混沌系统建模、复杂系统控制与信息安全等领域的工程技术人员。; 使用场景及目标:①开展分数阶微分方程系统的混沌特性分析与稳定性判据研究;②通过Lyapunov指数谱揭示系统在参数变化和阶次调节下的动力学演化规律;③为分数阶混沌系统的同步控制、保密通信、信号加密等实际应用提供理论支撑与算法基础。; 阅读建议:建议读者结合Matlab代码实现与相关数学理论同步学习,重点关注数值算法的实现细节、初值敏感性与积分步长对结果的影响,鼓励通过修改系统模型、调整分数阶阶次或引入外部激励等方式进行拓展性实验,以深化对分数阶系统非线性行为的理解。
内容概要:本文系统研究了基于三电平NPC换流器的双端VSC-HVDC背靠背系统的功率解耦控制策略与暂态恢复特性,并借助Simulink平台完成了完整的系统建模与仿真验证。研究深入剖析了系统的主电路拓扑结构、PWM调制机制以及有功功率与无功功率独立调控的理论基础,重点构建了包含内外环协同控制的控制系统架构,实现了对直流电压、交流电流等关键变量的精确动态调节。文章详细阐述了在外部扰动或故障条件下系统的暂态响应过程,评估了其故障穿越能力与恢复性能,通过仿真实验验证了所采用控制策略在提升系统动态响应速度、维持功率解耦能力和增强运行稳定性方面的有效性。; 适合人群:具备电力电子、高压直流输电或新能源并网等相关领域基础知识的研究生、科研人员及从事电力系统仿真与控制算法开发的工程技术人员。; 使用场景及目标:①用于高等院校或科研机构开展VSC-HVDC系统建模与先进控制策略的教学与科研工作;②为工程实践中高压直流输电系统的控制算法设计、参数整定与仿真验证提供可靠的技术参考;③支撑对三电平换流器拓扑优势及其在背靠背系统中应用潜力的深入理解与优化设计。; 阅读建议:建议结合提供的Simulink仿真模型同步研读,重点关注控制系统设计逻辑、内外环参数设计方法与仿真结果分析部分,宜在掌握基本电力电子变换器原理和矢量控制理论的基础上,进一步深化对多电平换流器控制特性与系统级动态行为的理解。
内容概要:本文系统研究了电励磁同步电机在异步牵入、稳态运行及能耗制动三个关键阶段的全周期动态特性,基于Matlab/Simulink平台构建完整的仿真模型,深入分析电机在不同工况下的运行行为与控制机理。研究聚焦于励磁电流、电磁转矩与转速之间的动态耦合关系,对各阶段的过渡过程进行精细化建模与仿真验证,尤其关注异步牵入过程中的转矩建立机制、稳态运行时的稳定性控制以及能耗制动阶段的能量回馈与减速特性,旨在为电励磁同步电机的实际工程应用、控制系统设计与优化提供坚实的理论依据和技术支撑。; 适合人群:具备电机学、电力电子与自动控制等相关专业知识背景,从事电气传动系统、电机控制算法研究或工程仿真实践的研究生、科研人员及工业领域内的电气工程师。; 使用场景及目标:①用于高等院校及科研机构开展电机控制课程教学与科研课题研究;②为工业现场高性能电励磁同步电机驱动系统的开发、调试与优化提供仿真验证手段与设计方案参考;③支撑电机全工况动态性能评估、控制策略设计与系统级集成测试。; 阅读建议:建议读者结合Matlab/Simulink环境动手复现文中所述仿真模型,重点关注各运行阶段切换时的动态响应细节与参数变化规律,深入理解控制逻辑设计原理与关键参数整定方法,以全面提升对电励磁同步电机系统级动态行为的认知与实际应用能力。

87,984

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧