在计算机中存储的数据执行的两种最常见操作是排序和检索。本文介绍了三种高级排序算法,是基于自己创建的数组测试平台而制作的,CArray()的具体定义需要参看上篇文章Javascript数据结构算法之排序一:http://blog.csdn.net/u011376293/article/details/69568333.
网页展示
代码部分
1.希尔排序
//sort.js
var newData = new CArray();
newData.setData();
function shellSort(){
var tempCArray = newData;//引用全局变量
var nums = tempCArray.numElements;//获取待排序数组内数据个数
var start = new Date().getTime();
//动态计算间隔
var h = 1;
while(h<nums/3)
{
h=3*h+1;
}
var temp, inner;
while(h>=1)
{
//循环内是插入算法
for(var outer = h; outer < nums; outer++)
{
temp = tempCArray.dataStore[outer];//tempCArray.dataStore[]存储着待排序数组
inner = outer;
while(inner>=h && temp<tempCArray.dataStore[inner-h])
{
tempCArray.dataStore[inner] = tempCArray.dataStore[inner-h];
inner = inner - h;
}
tempCArray.dataStore[inner] = temp;
}
h = (h-1)/3;
}
var stop = new Date().getTime();
var elapsed = stop - start;
var dataResult = document.getElementById("shell_data");
dataResult.innerHTML = tempCArray.toString();
var timeResult = document.getElementById("shell_time");
timeResult.value = "消耗的时间为:"+elapsed+"毫秒";
}
2.归并排序
//sort.js
function mergeArrays(arr, startLeft, stopLeft, startRight, stopRight){
//构建左子序列和右子序列
var rightArr = new Array(stopRight-startRight+1);
var leftArr = new Array(stopLeft-startLeft+1);
var k = startRight;
for(var i=0; i<stopRight-startRight; i++){
rightArr[i] = arr[k];
k++;
}
k = startLeft;
for(var j=0; j<stopLeft-startLeft; j++){
leftArr[j] = arr[k];
k++;
}
//Infinity用于标记左子序列和右子序列的结尾
rightArr[stopRight-startRight] = Infinity;
leftArr[stopLeft-startLeft] = Infinity;
//将两个子序列合成一个新的有序的序列
var m=0;
var n=0;
for(var k = startLeft; k<stopRight; k++)
{
if(leftArr[m] < rightArr[n])
{
arr[k] = leftArr[m];
m++;
}
else{
arr[k] = rightArr[n];
n++;
}
}
}
function mergeSort(){
var tempCArray = newData;
var nums = tempCArray.numElements;
var start = new Date().getTime();
//利用step变量控制生成的左右子序列的大小
//子序列的生成由1到大
var step = 1;
var left, right;
while(step < tempCArray.dataStore.length)
{
left = 0;
right = step;
while(right+step <= tempCArray.dataStore.length)
{
mergeArrays(tempCArray.dataStore, left, left+step, right, right+step);
left = right+step;
right = left+step;
}
if(right<tempCArray.dataStore.length)
{
mergeArrays(tempCArray.dataStore, left, left+step, right, tempCArray.dataStore.length);
}
step *= 2;
}
var stop = new Date().getTime();
var elapsed = stop - start;
var dataResult = document.getElementById("merge_data");
dataResult.innerHTML = tempCArray.toString();
var timeResult = document.getElementById("merge_time");
timeResult.value = "消耗的时间为:"+elapsed+"毫秒";
}
4.快速排序
//sort.js
function qSort(arr){
if(arr.length == 0)
{
return [];
}
//该算法使用递归方法
//将数据依次分解为包含较小数据和较大数据的不同子序列,直到所有数据有序
var lesser = [];
var greater = [];
//选取序列第一个元素为基准
var pivot = arr[0];
for(var i=1; i<arr.length; i++)
{
if(arr[i]<=pivot)
{
lesser.push(arr[i]);
}
else
{
greater.push(arr[i]);
}
}
return qSort(lesser).concat(pivot, qSort(greater));
}
function quickSort(){
var tempCArray = newData;
var nums = tempCArray.numElements;
var start = new Date().getTime();
var newCArray = qSort(tempCArray.dataStore);
var stop = new Date().getTime();
var elapsed = stop - start;
var dataResult = document.getElementById("quick_data");
dataResult.innerHTML = newCArray.toString();
var timeResult = document.getElementById("quick_time");
timeResult.value = "消耗的时间为:"+elapsed+"毫秒";
}