12

Please can you tell me what is wrong to this implementation of bubble sort algorithm in JavaScript?

for (var i=1; i<records.length; i++){
        for (var j=records.length; j<1; j--){
            if (parseInt(records[i-1]) < parseInt(records[i])){
                var temp = records[i-1];
                records[i-1] = records[i]
                records[i] = temp;
            }   
        }    
    }
2
  • 4
    This might work better if you tell us what the problem is with it, and then we might be able to tell your how to fix it. Commented Sep 21, 2011 at 15:33
  • these posts are regrettable, their writing does not respect the original algorithm. Commented Sep 7, 2022 at 1:23

7 Answers 7

37

Couple of codes for bubble sort

bubblesort should not be used for larger arrays, can be used for smaller ones for its simplicity.

Optimized way, with all Checks

const bubble_Sort = (nums) => {
  if(!Array.isArray(nums)) return -1; // --->if passed argument is not array
  if(nums.length<2) return nums; // --->if array length is one or less

    let swapped=false
     temp=0,
     count=-1,
     arrLength=0;


    do{
      count ++;
      swapped=false;
      arrLength = (nums.length-1) - count; //---> not loop through sorted items
      for(let i=0; i<=arrLength; i++){
          if(nums[i]>nums[i+1]){
            temp=nums[i+1];
            nums[i+1]=nums[i];
            nums[i]=temp;
            swapped=true;
          }
      }
    }

    while(swapped)
    return nums;
  }
  console.log(bubble_Sort([3, 0, 2, 5, -1, 4, 1]));

Method 1

var a = [33, 103, 3, 726, 200, 984, 198, 764, 9];

function bubbleSort(a) {
    var swapped;
    do {
        swapped = false;
        for (var i=0; i < a.length-1; i++) {
            if (a[i] > a[i+1]) {
                var temp = a[i];
                a[i] = a[i+1];
                a[i+1] = temp;
                swapped = true;
            }
        }
    } while (swapped);
}

bubbleSort(a);
console.log(a);

Method 2

function bubbleSort(items) {
    var length = items.length;
    //Number of passes
    for (var i = 0; i < length; i++) { 
        //Notice that j < (length - i)
        for (var j = 0; j < (length - i - 1); j++) { 
            //Compare the adjacent positions
            if(items[j] > items[j+1]) {
                //Swap the numbers
                var tmp = items[j];  //Temporary variable to hold the current number
                items[j] = items[j+1]; //Replace current number with adjacent number
                items[j+1] = tmp; //Replace adjacent number with current number
            }
        }        
    }
}

Method 3

function bubbleSort() {
    var numElements = this.dataStore.length;
    var temp;
    for (var outer = numElements; outer >= 2; --outer) {
        for (var inner = 0; inner <= outer-1; ++inner) {
            if (this.dataStore[inner] > this.dataStore[inner+1]) {
                swap(this.dataStore, inner, inner+1); }
        }
        console.log(this.toString()); 
    }
}
Sign up to request clarification or add additional context in comments.

6 Comments

Method 3 is error & partly codes! this.dataStore.length what's that mean ?error codes
In Method 1 , after each phase of swapping , bigger numbers always bubbles to right , so in the second phase , we can ignore the the last element , similarly after each phase we can reduce the size the array to be looked by 1 . This will reduce no of comparisons:
function bubbleSort(a) { var swapped, len = a.length; do { swapped = false; for (var i=0; i < len; i++) { if (a[i] > a[i+1]) { var temp = a[i]; a[i] = a[i+1]; a[i+1] = temp; swapped = true; } } len-- } while (swapped); } bubbleSort(a);
Optimized way rejects TypedArray (would return -1) although the algo would work with a TypedArray.
In the Optimized solution, it should be i<arrLength instead of i<=arrLength.
|
4
for (var j=records.length; j<1; j--){

Shouldn't that be

for (var j=records.length; j>1; j--){

7 Comments

i think it should be (records.length - 1) as the index start from 0
But j isn't used as an index into an array; rather it is used as a counter
is that really a bubble sort ? how will that work ??
It won't bubble sort at the moment - it will just keep swapping the i and (i - 1)th element. I was just pointing out the obvious problem with his code (the reason the inner loop wasn't being entered).
yeah i was pointing that too :)
|
3

A simple implementation in ES6 JavaScript will be

    function BubbleSort(arr) {
      const sortedArray = Array.from(arr);
      let swap;
      do {
        swap = false;
        for (let i = 1; i < sortedArray.length; ++i) {
          if (sortedArray[i - 1] > sortedArray[i]) {
            [sortedArray[i], sortedArray[i - 1]] = [sortedArray[i - 1], sortedArray[i]];
            swap = true;
          }
        }
      } while (swap)
      return sortedArray;
    }
console.log(BubbleSort([3, 12, 9, 5]));

1 Comment

these posts are regrettable, their writing does not respect the original algorithm.
1

you should use j instead of i in the second loop, and don't forget to change the j<1 to j>1

4 Comments

Well thank you, i think i use J instead of I
if (parseInt(records[i-1]) < parseInt(records[i])){ var temp = records[i-1]; records[i-1] = records[i] records[i] = temp; that's i there
Yes you are right, but then i get: TypeError: records[j] is undefined
that's because you are trying to access records[records.length], which doesn't exist in this array, if you want to start the for loop from the end, you have to start with records.length-1 for (var j=records.length-1; j>0; j--)
1

I believe that in a bubble sort, once the i loop has completed an iteration, then the i'th element is now in its correct position. That means that you should write the j loop as

for (var j = i + 1; j < records.length; j++)

Otherwise your bubble sort will be (even more) inefficient.

Comments

1

My solution:

  function bubbleSort(A){
  var swapped,
      len = arr.length;

  if(len === 1) return;

  do {
    swapped = false;
    for(var i=1;i<len;i++) {
      if(A[i-1] > A[i]) {   
        var b = A[i];
        A[i] = A[i-1];
        A[i-1] = b;
        swapped = true;
      }   
    }

  }
  while(swapped)  
}

var arr = [1, 6, 9, 5, 3, 4, 2, 12, 4567, 5, 34];
bubbleSort(arr);
document.write(arr);

1 Comment

these posts are regrettable, their writing does not respect the original algorithm.
-1

the second for loop is coded wrong it should be

for (var i=0; i<records.length; i++){
    for (var j=0; j<records.length; j++){
        if (parseInt(records[i]) > parseInt(records[j])){
            var temp = records[i];
            records[i] = records[j];
            records[j] = temp;
        }   
    }    
}

3 Comments

It is better to nest your for loop inside a while loop and establish a predicate for looping. The code above will continue looping and looping, till it ends... even once the list elements have already been placed in order.
I think your code works O(n2) when best case also at place. it costly to have like this code. according to this situation its not quite well. stick to the complexity also
these posts are regrettable, their writing does not respect the original algorithm.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.