Thursday, July 7, 2011

Simple sorting in JavaScript

About three years ago I graduated and got my degree in Applied Computer Science. Although it says Computer Science, we hardly ever focused on data structures and algorithms. Obviously, I now see that as a shortcoming. So I plan to make up for that by reading up on some of the basics. While at it, I might be blogging on some of the topics.

I am going to start by implementing some of the simple sorting algorithms in JavaScript.

Find the final result here.

Bubble sort

The first sorting algorithm I'm going to implement is probably also the easiest, and slowest in most scenario's: Bubble sort.
Bubble sort is a simple sorting algorithm that works by repeatedly stepping through the list to be sorted, comparing each pair of adjacent items and swapping them if they are in the wrong order. The pass through the list is repeated until no swaps are needed, which indicates that the list is sorted.
Let's start by defining a namespace.

var algorithms = { };

We could extend the native array object, but to keep things simple, let's create our own sortArray object.

var algorithms = {         
    sortArray : function(){
                
    } 
};

The sortArray object contains a private array of elements. To add elements to that array, we will expose a push function on our sortArray object.

var algorithms = {         
    sortArray : function(){
        var elements = [];                                                                           
                     
        this.push = function(val){
            elements.push(val);                    
        };                                       
    } 
};

So far we can do something like this.

var sortArr = new algorithms.sortArray();               
             
sortArr.push(80);
sortArr.push(20);
sortArr.push(...);

Now we have to add a public sort function. Before we do that we need to define a private swap function, which can swap elements.

var swap = function(one, two) {
    var tmp = elements[one];
    elements[one] = elements[two];
    elements[two] = tmp;                    
};

The bubbleSort function will take a callback argument which will be called every sort iteration.

this.bubbleSort = function(callback) {   
    callback(elements);
    //Loop over all the elements
    for (var out = elements.length - 1; out > 0; out--){                            
        for (var inn = 0; inn < out; inn++) {
            //Are they out of order?
            if (elements[inn] > elements[inn+1]){
                swap(inn, inn+1);                                
            } 
        }
        callback(elements);
    }                    
};

That should be it. Now let's try to push some elements in the array, define a callback and call the bubbleSort function. In the callback function I'm using the Google Charts API to visualize the sorting process.

$(document).ready(function() {             
    ...                                 
                
    var results = $("#results");
    
    var drawElements = function(elements) {                            
        var chd = "";                    
        
        for (var e in elements) {
            chd += elements[e].toString() + ",";
        }
        
        //Remove that last ","
        chd = chd.substring(0, chd.length - 1);                        
        
        //Build the Google Charts url
        var chartUrlBase = "http://chart.apis.google.com/chart?chxt=y&chbh=a&chs=300x225&cht=bvg&chco=A2C180,3D7930&chtt=Sorting";
        var chartUrlComplete = chartUrlBase + "&chd=t:" + chd;                                    
        
        $("#results").append("<img src='" + chartUrlComplete + "'/>").append("<br/>");                                                                                                                                         
    }                              
                         
    sortArr.bubbleSort(drawElements);                               
});

Selection sort

The second algorithm is Selection sort. I found this one the easiest to understand so far: find the mimimum value, swap it with the value in the first position, advance one position and repeat.
Selection sort is a sorting algorithm, specifically an in-place comparison sort. It has O(n2) time complexity, making it inefficient on large lists, and generally performs worse than the similar insertion sort. Selection sort is noted for its simplicity, and also has performance advantages over more complicated algorithms in certain situations, particularly where auxiliary memory is limited.
Let's start by giving the BubbleSort callback function another place. We will make this a public function on our sortArray. I will name it onSort and set it to an empty function by default.

this.onSort = function() {};      

Once that is done we can define our public selectionSort function. This function calls the onSort function every sort iteration.

this.selectionSort = function(){
    this.onSort(elements);
    for (var out = 0; out < elements.length - 1; out++) {
        var min = out;
        for (var inn = out; inn < elements.length; inn++) {
            //If minium greater => new minimum
            if (elements[inn] < elements[min]){
                min = inn;
            }                            
        }
        swap(out, min);
        this.onSort(elements);
    }
};

Insertion sort

The last simple sorting algorithm I'm going to implement in this post is Insertion sort.
Insertion sort is a simple sorting algorithm: a comparison sort in which the sorted array (or list) is built one entry at a time.

Every repetition of insertion sort removes an element from the input data, inserting it into the correct position in the already-sorted list, until no input elements remain. The choice of which element to remove from the input is arbitrary, and can be made using almost any choice algorithm.
The insertionSort is just another public function on our sortArray object.

this.insertionSort = function(){
    this.onSort(elements);
    for (var out = 1; out < elements.length; out++){                        
        var temp = elements[out];
        var inn = out;
        
        //Until one is smaller
        while (inn > 0 && elements[inn-1] >= temp){
            elements[inn] = elements[inn-1];

            inn--;
        }
        elements[inn] = temp;
        this.onSort(elements);
    }
}

You can find the final result here. If you have any remarks on these implementations, please let me know!

4 comments:

  1. Very informative post. I am just wetting my feet into JS/jQuery and I really liked how well your javascript code is organised. Like many others, I am having a little hard time transferring my OOPs skills from .Net to JS, but your code helped me understand a few more concepts and a practical implementation. Thank you.

    ReplyDelete
  2. For additional sorting info, I recommend http://www.sorting-algorithms.com/

    ReplyDelete
  3. Glad you liked it!

    Thanks for the link :)

    ReplyDelete
  4. Thanks for sharing your info. I really appreciate your efforts and I will be waiting for your further write ups thanks once again.
    html5 media player

    ReplyDelete