Javascript数据结构算法之排序二(希尔排序,归并排序,快速排序)

在计算机中存储的数据执行的两种最常见操作是排序和检索。本文介绍了三种高级排序算法,是基于自己创建的数组测试平台而制作的,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+"毫秒";
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值