冒泡排序法 插入排序法 选择排序法 归并排序法 堆排序法(javascript实现)

<!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>sort</title>
<script type="text/javascript">
var arr=new Array();
//产生十个随机数
for(var i=0;i<10;i++){
arr.push(parseInt(Math.random()*100));
}
document.writeln(arr);

/**
* 冒泡排序法
* @param arr 数组
* @return 排序后的数组
*/
var BubbleSort=function(arr){
var arrLen=arr.length;
for(var i=0;i<arrLen;i++){
for(var j=arrLen-1;j>i;j--){
if(arr[j]<arr[j-1]){
temp=arr[j];
arr[j]=arr[j-1];
arr[j-1]=temp;
}
}
}
return arr;
}

/**
* 插入排序法
* @param arr 数组
* @return 排序后的数组
*/
var InsertSort=function(arr){
var arrLen=arr.length;
 for(var i=1;i<arrLen;i++){
temp = arr[i];
for(var j=i ; j>0 && temp < arr[j-1] ; j--){
  arr[j]=arr[j-1];
}  
arr[j]=temp;   
}
return arr;
}

/**
* 选择排序法
* @param arr 数组
* @return 排序后的数组
*/
var SelectSort=function(arr){
var arrLen=arr.length;
for(var i=0;i<arrLen;i++){
var minIndex = i;
for(var j=i;j<arrLen;j++){
if(arr[minIndex]>arr[j]) {
minIndex=j;
key = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = key;
}
}
}
return arr;
}

/**
* 归并排序法合并
* @param arr 数组
* @return 合并的数组
*/
var Merge=function(left, right) {
var re = [];
while(left.length > 0 && right.length > 0) {
if(left[0] < right[0]) {
re.push(left.shift());
} else {
re.push(right.shift());
}
}
return re.concat(left).concat(right);
}
/**
* 归并排序法
* @param arr 数组
* @return 排序后的数组
*/
var MergeSort=function(arr){
if(arr.length == 1) return arr;
var arrLen=arr.length;
var m = Math.floor(arr.length / 2);
var left = arr.slice(0, m);
var right = arr.slice(m);
return Merge(MergeSort(left), MergeSort(right));
}

/**
* 堆排序法
* @param arr 数组
* @return 排序后的数组
*/
var HeapSort=function(items)
{
items = array2heap(items); //将数组转化为堆
for(var i = items.length - 1; i >= 0; i--)
{
items = swap(items, 0, i); //将根和位置i的数据交换(用于将最大值放在最后面)
items = moveDown(items, 0, i - 1); //数据交换后恢复堆的属性
}
return items;
}
/**
* 将数组转换为堆
* @param arr 数组
* @return 堆
*/
var array2heap=function(items)
{
for(var i = Math.ceil(items.length / 2) - 1; i >= 0; i--)
{
items = moveDown(items, i, items.length - 1); //转换为堆属性
}
return items;
}
/**
* 转换为堆
* @param items 数组
* @param first 第一个元素
* @param last 最后一个元素
* @return 堆
*/
var moveDown=function(items, first, last)
{
var largest = 2 * first + 1;
while(largest <= last)
{
if(largest < last && items[largest] < items[largest + 1])
{
largest++;
}
if(items[first] < items[largest])
{
items = swap(items, first, largest); // 交换数据
first = largest; //往下移
largest = 2 * first + 1;
}
else
{
largest = last + 1; //跳出循环
}
}
return items;
}
/**
* 交换数据
* @param items 数组
* @param index1 索引1
* @param index2 索引2
* @return 数据交换后的数组
*/
var swap=function(items, index1, index2)
{
var tmp = items[index1];
items[index1] = items[index2];
items[index2] = tmp;
return items;
}

var arr =HeapSort(arr);
document.writeln("<br>");
document.writeln(arr);
</script>
</head>

<body>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值