JavaScript快速排序算法QuickSort实现

http://www.codeproject.com/Tips/798092/JavaScript-Quick-Sort-Array-Proto-Type-Method


Introduction

This is a proto type method for arrays in JavaScript. It utilizes an iterative version of the Quick Sort algorithm. More information about the quick sort algorithm can be found here.

Background

I adapted an iterative version of Quick Sort made in C located here. I tested this iterative version and a recursive version and found that the iterative version usually preforms about twice as fast. I also included some additional features that are not included in the vanilla version of JavaScript sort.

JavaScript Quick Sort Library

(function()
{
    var
    defaultCompare,
    defaultSwap,
    partition,
    quickSort;
    
    Array.prototype.quickSort = function(compare, swap)
    {
        if (typeof compare !== "function")
        {
            compare = defaultCompare;
        }
        if (typeof swap !== "function")
        {
            swap = defaultSwap;
        }
        quickSort(this, 0, this.length - 1, compare, swap);
    };
    defaultCompare = function(value1, value2)
    {
        return value1 < value2;
    };
    defaultSwap = function(array, index1, index2)
    {
        var temp = array[index1];
        array[index1] = array[index2];
        array[index2] = temp;
    };
    partition = function(array, start, stop, compare, swap)
    {
        var pivot = array[stop], storeIndex = start - 1;

        while (start < stop)
        {
            if (compare(array[start], pivot))
            {
                storeIndex++;
                swap(array, storeIndex, start);
            }
            start++;
        }
        swap(array, storeIndex + 1, stop);
        return storeIndex + 1;
    };
    quickSort = function(array, startIndex, stopIndex, compare, swap)
    {
        var pivot, stack, start, top;
        
        stack = new Array(stopIndex - startIndex + 1);
        top = -1;
        
        stack[++top] = startIndex;
        stack[++top] = stopIndex;

        while (top > -1)
        {
            stopIndex = stack[top--];
            startIndex = stack[top--];

            pivot = partition(array, startIndex, stopIndex, compare, swap);
            
            if (pivot - 1 > startIndex)
            {
                stack[++top] = startIndex;
                stack[++top] = pivot - 1;
            }

            if (pivot + 1 < stopIndex)
            {
                stack[++top] = pivot + 1;
                stack[++top] = stopIndex;
            }
        }
    };
}());

Using the libary

These examples explain how to use this code.

//
//Plain Sort
//
var plainSort = [4, 7, 6, 5, 7, 0, 1, 5, 10, 10, 8];
plainSort.quickSort();
console.log(JSON.stringify(plainSort));
//Prints: [0,1,4,5,5,6,7,7,8,10,10]

//
//Sort With Custom Compare Function
//
var descendingOrder = [4, 7, 6, 5, 7, 0, 1, 5, 10, 10, 8];
descendingOrder.quickSort(function(a, b)
{
    //Descending order compare
    return a > b;
});
console.log(JSON.stringify(descendingOrder));
//Prints: [10,10,8,7,7,6,5,5,4,1,0]

//
//Sort multiple arrays with a custom compare
//
var table =
{
    "employeeName": ["Jane", "John", "Tom", "Alex", "Mary"],
    "id": [10, 5, 7, 3, 0]
};
table.employeeName.quickSort(function(a, b)
{
    //Strings have to be compared using the localeCompare function
    return (a || "").localeCompare(b) < 0;
},
function(array, index1, index2)
{
    //Sorts both arrays in the 'table' object
    var temp = array[index1];
    array[index1] = array[index2];
    array[index2] = temp;
    
    temp = table.id[index1];
    table.id[index1] = table.id[index2];
    table.id[index2] = temp;
});
console.log(JSON.stringify(table));
//Prints:{"employeeName":["Alex","Jane","John","Mary","Tom"],"id":[3,10,5,0,7]} 

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值