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>

...全文
195 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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]
说改进说不上。这些都是前人总结下来的精华,以前楼主好象发过一次类似的帖子。该类帖肯定有。但是我不记得是具体哪天了。

87,997

社区成员

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

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