8

Any idea how I can view the implementation of native javascript methods specifically the sort method. The reason why I am looking for this I am just wondering what the algorithm used is and what is the complexity of the same.

I am sorting a huge json object in javascript and I was wondering if I should write my own mety hod for the same.

Also does the implementation differ from browser to browser?

Baz1nga
  • 15,010
  • 3
  • 31
  • 59
  • 1
    Whatever you're doing, I can guarantee you that you *won't* beat hand-optimized C or C++ code in JS for the general case. Just use the existing option, it will work well enough. And if it doesn't, the bottleneck is most likely *not* `sort` but some of your algorithms. –  Jul 10 '11 at 09:49
  • No there is no other bottleneck..The performance is good enough but as the no of entities increase the no of comparisons increase. Was wondering what goes on inside that method. – Baz1nga Jul 10 '11 at 09:54
  • 1
    Of course the number of comparisions increase, even the best (complexity-wise) sort algorithms are `O(n * log n)` ;) –  Jul 10 '11 at 10:00

3 Answers3

4

Take a look at the WebKit implementation: https://gist.github.com/964673. Apparently, it uses min sort/selection sort. From: http://svn.webkit.org/repository/webkit/trunk/Source/JavaScriptCore/runtime/ArrayPrototype.cpp

SpiderMonkey seems to indeed use MergeSort. See: http://hg.mozilla.org/mozilla-central/file/28be8df0deb7/js/src/jsarray.cpp.

david
  • 451
  • 4
  • 13
1

Also does the implementation differ from browser to browser?

Yes, the ECMAScript standard does not specify what algorithm should be used. AFAIK Mozillas SpiderMonkey uses mergesort and WebKit uses selection sort. What IE uses you probably have to ask someone at Microsoft, since it's closed source.

And I'm willing to bet a couple of bucks that you cannot come up with a better/faster algorithm than the one implemented into the JavaScript engine of the browsers.

Björn
  • 27,479
  • 9
  • 63
  • 81
  • thats true.. but i can write it in a way that suits my problem.. and I am not worried abt the peformance on chrome or FFX. its mostly ie7 – Baz1nga Jul 10 '11 at 10:27
0

Unfortunately, there doesn't appear to be a standardized method.

Until that time comes, you could write your own simple alphabetization function:

sortObject = function (){
    var arr = [], i;
    for(i in this){
        arr.push({index:i,content:this[i]});
        delete this[i];
    }
    arr.sort();
    for(i in arr){
        var item = arr[i];
        this[item.index] = item.content;
    }
    return this; // make chainable
}
var obj = {
    acronym: "OOP",
    definition: "Object-Oriented Programming",
    article: "http://wikipedia.org/OOP"
};
sortObject.apply(obj); // indices are "acronym", "article", "definition"

I know this question was asked over a year ago, but I hope this helps you as well as anyone with the same problem.

Braden Best
  • 7,664
  • 3
  • 29
  • 42