Possibly bubble sort algorithmHow can I speed up my shell sort?Stable Sort in C#Bubble sort a list of integers for a number of iterationsMerge Sort algorithmExact sort - sorting with few move operationsBubble Sort in Objective-CRobust Bubble Sort in VBAMeasuring the time for the bubble sort algorithmCustom sorting algo / optimized bubble sortBubble and Cocktail sort

Example of a relative pronoun

What would the Romans have called "sorcery"?

I probably found a bug with the sudo apt install function

Prevent a directory in /tmp from being deleted

Is it tax fraud for an individual to declare non-taxable revenue as taxable income? (US tax laws)

Why has Russell's definition of numbers using equivalence classes been finally abandoned? ( If it has actually been abandoned).

Is it possible to do 50 km distance without any previous training?

How long does it take to type this?

Set-theoretical foundations of Mathematics with only bounded quantifiers

I’m planning on buying a laser printer but concerned about the life cycle of toner in the machine

Why is an old chain unsafe?

A newer friend of my brother's gave him a load of baseball cards that are supposedly extremely valuable. Is this a scam?

"which" command doesn't work / path of Safari?

Shell script can be run only with sh command

Is there really no realistic way for a skeleton monster to move around without magic?

Can I interfere when another PC is about to be attacked?

Why don't electron-positron collisions release infinite energy?

Why is the design of haulage companies so “special”?

Modification to Chariots for Heavy Cavalry Analogue for 4-armed race

How to type dʒ symbol (IPA) on Mac?

A Journey Through Space and Time

"You are your self first supporter", a more proper way to say it

What Brexit solution does the DUP want?

whey we use polarized capacitor?



Possibly bubble sort algorithm


How can I speed up my shell sort?Stable Sort in C#Bubble sort a list of integers for a number of iterationsMerge Sort algorithmExact sort - sorting with few move operationsBubble Sort in Objective-CRobust Bubble Sort in VBAMeasuring the time for the bubble sort algorithmCustom sorting algo / optimized bubble sortBubble and Cocktail sort






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








3












$begingroup$


I'm trying to figure out what to call this sorting algorithm:






function sort(array) 
array = array.slice();

for (let i = 0; i < array.length; i++)
for (let j = 0; j < array.length - 1; j++)
if (array[j] > array[i])
//swap
[array[i], array[j]] = [array[j], array[i]]




return array;


console.log(sort([8, 4, 5, 2, 3, 7]));





I wrote it while trying to figure out bubble sort which is a lot different. Tho will have slightly the same running time as the actual bubble sort. I might be wrong :(










share|improve this question









New contributor




Ademola Adegbuyi is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.







$endgroup$


















    3












    $begingroup$


    I'm trying to figure out what to call this sorting algorithm:






    function sort(array) 
    array = array.slice();

    for (let i = 0; i < array.length; i++)
    for (let j = 0; j < array.length - 1; j++)
    if (array[j] > array[i])
    //swap
    [array[i], array[j]] = [array[j], array[i]]




    return array;


    console.log(sort([8, 4, 5, 2, 3, 7]));





    I wrote it while trying to figure out bubble sort which is a lot different. Tho will have slightly the same running time as the actual bubble sort. I might be wrong :(










    share|improve this question









    New contributor




    Ademola Adegbuyi is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.







    $endgroup$














      3












      3








      3


      1



      $begingroup$


      I'm trying to figure out what to call this sorting algorithm:






      function sort(array) 
      array = array.slice();

      for (let i = 0; i < array.length; i++)
      for (let j = 0; j < array.length - 1; j++)
      if (array[j] > array[i])
      //swap
      [array[i], array[j]] = [array[j], array[i]]




      return array;


      console.log(sort([8, 4, 5, 2, 3, 7]));





      I wrote it while trying to figure out bubble sort which is a lot different. Tho will have slightly the same running time as the actual bubble sort. I might be wrong :(










      share|improve this question









      New contributor




      Ademola Adegbuyi is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.







      $endgroup$




      I'm trying to figure out what to call this sorting algorithm:






      function sort(array) 
      array = array.slice();

      for (let i = 0; i < array.length; i++)
      for (let j = 0; j < array.length - 1; j++)
      if (array[j] > array[i])
      //swap
      [array[i], array[j]] = [array[j], array[i]]




      return array;


      console.log(sort([8, 4, 5, 2, 3, 7]));





      I wrote it while trying to figure out bubble sort which is a lot different. Tho will have slightly the same running time as the actual bubble sort. I might be wrong :(






      function sort(array) 
      array = array.slice();

      for (let i = 0; i < array.length; i++)
      for (let j = 0; j < array.length - 1; j++)
      if (array[j] > array[i])
      //swap
      [array[i], array[j]] = [array[j], array[i]]




      return array;


      console.log(sort([8, 4, 5, 2, 3, 7]));





      function sort(array) 
      array = array.slice();

      for (let i = 0; i < array.length; i++)
      for (let j = 0; j < array.length - 1; j++)
      if (array[j] > array[i])
      //swap
      [array[i], array[j]] = [array[j], array[i]]




      return array;


      console.log(sort([8, 4, 5, 2, 3, 7]));






      javascript algorithm sorting






      share|improve this question









      New contributor




      Ademola Adegbuyi is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.











      share|improve this question









      New contributor




      Ademola Adegbuyi is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      share|improve this question




      share|improve this question








      edited 7 hours ago









      200_success

      131k17157422




      131k17157422






      New contributor




      Ademola Adegbuyi is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      asked 8 hours ago









      Ademola AdegbuyiAdemola Adegbuyi

      1185




      1185




      New contributor




      Ademola Adegbuyi is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.





      New contributor





      Ademola Adegbuyi is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






      Ademola Adegbuyi is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.




















          2 Answers
          2






          active

          oldest

          votes


















          3












          $begingroup$

          To me, that's exactly Bubblesort: it takes care the largest element moves to the end of the array, and then operates on length-1 elements.



          Edit: this does look quite similar to Bubblesort, but - as a diligent reader noticed - is not quite Bubblesort, as the algorithm does not compare (and swap) adjacent elements (which indeed is the main characteristic of Bubblesort). If you replace array[j] > array[i] with array[j] > array[j+1], you will get Bubblesort.



          This implementation will fail if less than two input elements are given (0 or 1) - hint: the array is already sorted in these cases (just add an if).



          A small improvement would be to add a flag in the i loop which records if any swapping happened at all - the outer for loop may terminate if the inner loop didn't perform any swaps. (Time) performance of Bubblesort is considered to be awful in comparison to other algorithms, but it must be noted it's the fastest algorithm on an already sorted array - if you add that flag ;)






          share|improve this answer











          $endgroup$








          • 1




            $begingroup$
            So, I visualized the execution on pythontutor.com. One should "never" use this. It's worse than the unoptimized version of bubble sort. I goes forth and back, which takes more time. Thanks!
            $endgroup$
            – Ademola Adegbuyi
            7 hours ago







          • 1




            $begingroup$
            No. One of the defining characteristics of Bubble sort is that it swaps adjacent elements — which is not the case with this code.
            $endgroup$
            – 200_success
            7 hours ago










          • $begingroup$
            @200_success you are absolutely right - about to edit my answer :)
            $endgroup$
            – jvb
            6 hours ago










          • $begingroup$
            @200_success: The OP's code is actually a (rather inefficient) variant of insertion sort, with some mostly useless extra shuffling of the tail end of the array thrown in.
            $endgroup$
            – Ilmari Karonen
            51 mins ago


















          1












          $begingroup$

          It's not even obvious at a glance that your algorithm really sorts all inputs correctly. In fact, it does, but proving that takes a bit of thought.



          The key insight is that, at the end of each iteration of the outer loop, the elements at positions from 0 to i will be sorted correctly:



          for (let i = 0; i < array.length; i++) 
          for (let j = 0; j < array.length - 1; j++)
          if (array[j] > array[i])
          [array[i], array[j]] = [array[j], array[i]]


          // Invariant: here array[0] to array[i] will be correctly sorted!



          In particular, this invariant will obviously be true at the end of the first iteration, when i == 0. It is then not hard to inductively show that, if this was true at the end of the previous iteration, then it will remain true (with i now one greater than before) after the next one as well. Thus, at the end of the last iteration, with i == array.length - 1, the whole array will be correctly sorted.




          Actually, to achieve this, we only need to iterate the inner loop up to j == i - 1; the iteration with i == j obviously does nothing useful, and any later iterations of the inner loop have no effect on the invariant. (Those iterations can only swap the element currently at index i with a larger one from the tail end of the array, which will still leave array[i] greater than or equal to all its predecessors.) So we can speed up your algorithm by only iterating the inner loop until j == i:



          for (let i = 0; i < array.length; i++) 
          for (let j = 0; j < i; j++)
          if (array[j] > array[i])
          [array[i], array[j]] = [array[j], array[i]]


          // Invariant: here array[0] to array[i] will be correctly sorted!



          With this optimization, your algorithm can be recognized as a form of insertion sort.




          It's generally not the most efficient form of that algorithm, though, since the inner loop does the insertion of array[i] into its correct position somewhat inefficiently. A somewhat more efficient implementation would be something like this:



          for (let i = 1; i < array.length; i++) 
          let j = i, temp = array[i];
          while (j > 0 && array[j - 1] > temp)
          array[j] = array[j - 1];
          j--;

          if (j < i) array[j] = temp;
          // Invariant: here array[0] to array[i] will be correctly sorted!



          By running the inner loop "backwards" we can stop it as soon as we find an element that's ranked lower than the one we're inserting (thus avoiding lots of needless comparisons, especially if the input array is already mostly sorted), and by saving the element to be inserted in a temporary variable, we can replace the swaps with simple assignments.



          The if (j < i) part of the code above is not really necessary, since if j == i, assigning temp back to array[i] would have no effect. That said, it's generally a useful optimization if integer comparisons are cheaper than array assignments, which is usually the case. The same goes for starting the outer loop from let i = 1 instead of let i = 0; the iteration with i == 0 does nothing anyway, so we can safely skip it!






          share|improve this answer









          $endgroup$













            Your Answer





            StackExchange.ifUsing("editor", function ()
            return StackExchange.using("mathjaxEditing", function ()
            StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix)
            StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
            );
            );
            , "mathjax-editing");

            StackExchange.ifUsing("editor", function ()
            StackExchange.using("externalEditor", function ()
            StackExchange.using("snippets", function ()
            StackExchange.snippets.init();
            );
            );
            , "code-snippets");

            StackExchange.ready(function()
            var channelOptions =
            tags: "".split(" "),
            id: "196"
            ;
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function()
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled)
            StackExchange.using("snippets", function()
            createEditor();
            );

            else
            createEditor();

            );

            function createEditor()
            StackExchange.prepareEditor(
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: false,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: null,
            bindNavPrevention: true,
            postfix: "",
            imageUploader:
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            ,
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            );



            );






            Ademola Adegbuyi is a new contributor. Be nice, and check out our Code of Conduct.









            draft saved

            draft discarded


















            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f217017%2fpossibly-bubble-sort-algorithm%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown

























            2 Answers
            2






            active

            oldest

            votes








            2 Answers
            2






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            3












            $begingroup$

            To me, that's exactly Bubblesort: it takes care the largest element moves to the end of the array, and then operates on length-1 elements.



            Edit: this does look quite similar to Bubblesort, but - as a diligent reader noticed - is not quite Bubblesort, as the algorithm does not compare (and swap) adjacent elements (which indeed is the main characteristic of Bubblesort). If you replace array[j] > array[i] with array[j] > array[j+1], you will get Bubblesort.



            This implementation will fail if less than two input elements are given (0 or 1) - hint: the array is already sorted in these cases (just add an if).



            A small improvement would be to add a flag in the i loop which records if any swapping happened at all - the outer for loop may terminate if the inner loop didn't perform any swaps. (Time) performance of Bubblesort is considered to be awful in comparison to other algorithms, but it must be noted it's the fastest algorithm on an already sorted array - if you add that flag ;)






            share|improve this answer











            $endgroup$








            • 1




              $begingroup$
              So, I visualized the execution on pythontutor.com. One should "never" use this. It's worse than the unoptimized version of bubble sort. I goes forth and back, which takes more time. Thanks!
              $endgroup$
              – Ademola Adegbuyi
              7 hours ago







            • 1




              $begingroup$
              No. One of the defining characteristics of Bubble sort is that it swaps adjacent elements — which is not the case with this code.
              $endgroup$
              – 200_success
              7 hours ago










            • $begingroup$
              @200_success you are absolutely right - about to edit my answer :)
              $endgroup$
              – jvb
              6 hours ago










            • $begingroup$
              @200_success: The OP's code is actually a (rather inefficient) variant of insertion sort, with some mostly useless extra shuffling of the tail end of the array thrown in.
              $endgroup$
              – Ilmari Karonen
              51 mins ago















            3












            $begingroup$

            To me, that's exactly Bubblesort: it takes care the largest element moves to the end of the array, and then operates on length-1 elements.



            Edit: this does look quite similar to Bubblesort, but - as a diligent reader noticed - is not quite Bubblesort, as the algorithm does not compare (and swap) adjacent elements (which indeed is the main characteristic of Bubblesort). If you replace array[j] > array[i] with array[j] > array[j+1], you will get Bubblesort.



            This implementation will fail if less than two input elements are given (0 or 1) - hint: the array is already sorted in these cases (just add an if).



            A small improvement would be to add a flag in the i loop which records if any swapping happened at all - the outer for loop may terminate if the inner loop didn't perform any swaps. (Time) performance of Bubblesort is considered to be awful in comparison to other algorithms, but it must be noted it's the fastest algorithm on an already sorted array - if you add that flag ;)






            share|improve this answer











            $endgroup$








            • 1




              $begingroup$
              So, I visualized the execution on pythontutor.com. One should "never" use this. It's worse than the unoptimized version of bubble sort. I goes forth and back, which takes more time. Thanks!
              $endgroup$
              – Ademola Adegbuyi
              7 hours ago







            • 1




              $begingroup$
              No. One of the defining characteristics of Bubble sort is that it swaps adjacent elements — which is not the case with this code.
              $endgroup$
              – 200_success
              7 hours ago










            • $begingroup$
              @200_success you are absolutely right - about to edit my answer :)
              $endgroup$
              – jvb
              6 hours ago










            • $begingroup$
              @200_success: The OP's code is actually a (rather inefficient) variant of insertion sort, with some mostly useless extra shuffling of the tail end of the array thrown in.
              $endgroup$
              – Ilmari Karonen
              51 mins ago













            3












            3








            3





            $begingroup$

            To me, that's exactly Bubblesort: it takes care the largest element moves to the end of the array, and then operates on length-1 elements.



            Edit: this does look quite similar to Bubblesort, but - as a diligent reader noticed - is not quite Bubblesort, as the algorithm does not compare (and swap) adjacent elements (which indeed is the main characteristic of Bubblesort). If you replace array[j] > array[i] with array[j] > array[j+1], you will get Bubblesort.



            This implementation will fail if less than two input elements are given (0 or 1) - hint: the array is already sorted in these cases (just add an if).



            A small improvement would be to add a flag in the i loop which records if any swapping happened at all - the outer for loop may terminate if the inner loop didn't perform any swaps. (Time) performance of Bubblesort is considered to be awful in comparison to other algorithms, but it must be noted it's the fastest algorithm on an already sorted array - if you add that flag ;)






            share|improve this answer











            $endgroup$



            To me, that's exactly Bubblesort: it takes care the largest element moves to the end of the array, and then operates on length-1 elements.



            Edit: this does look quite similar to Bubblesort, but - as a diligent reader noticed - is not quite Bubblesort, as the algorithm does not compare (and swap) adjacent elements (which indeed is the main characteristic of Bubblesort). If you replace array[j] > array[i] with array[j] > array[j+1], you will get Bubblesort.



            This implementation will fail if less than two input elements are given (0 or 1) - hint: the array is already sorted in these cases (just add an if).



            A small improvement would be to add a flag in the i loop which records if any swapping happened at all - the outer for loop may terminate if the inner loop didn't perform any swaps. (Time) performance of Bubblesort is considered to be awful in comparison to other algorithms, but it must be noted it's the fastest algorithm on an already sorted array - if you add that flag ;)







            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited 6 hours ago

























            answered 8 hours ago









            jvbjvb

            879210




            879210







            • 1




              $begingroup$
              So, I visualized the execution on pythontutor.com. One should "never" use this. It's worse than the unoptimized version of bubble sort. I goes forth and back, which takes more time. Thanks!
              $endgroup$
              – Ademola Adegbuyi
              7 hours ago







            • 1




              $begingroup$
              No. One of the defining characteristics of Bubble sort is that it swaps adjacent elements — which is not the case with this code.
              $endgroup$
              – 200_success
              7 hours ago










            • $begingroup$
              @200_success you are absolutely right - about to edit my answer :)
              $endgroup$
              – jvb
              6 hours ago










            • $begingroup$
              @200_success: The OP's code is actually a (rather inefficient) variant of insertion sort, with some mostly useless extra shuffling of the tail end of the array thrown in.
              $endgroup$
              – Ilmari Karonen
              51 mins ago












            • 1




              $begingroup$
              So, I visualized the execution on pythontutor.com. One should "never" use this. It's worse than the unoptimized version of bubble sort. I goes forth and back, which takes more time. Thanks!
              $endgroup$
              – Ademola Adegbuyi
              7 hours ago







            • 1




              $begingroup$
              No. One of the defining characteristics of Bubble sort is that it swaps adjacent elements — which is not the case with this code.
              $endgroup$
              – 200_success
              7 hours ago










            • $begingroup$
              @200_success you are absolutely right - about to edit my answer :)
              $endgroup$
              – jvb
              6 hours ago










            • $begingroup$
              @200_success: The OP's code is actually a (rather inefficient) variant of insertion sort, with some mostly useless extra shuffling of the tail end of the array thrown in.
              $endgroup$
              – Ilmari Karonen
              51 mins ago







            1




            1




            $begingroup$
            So, I visualized the execution on pythontutor.com. One should "never" use this. It's worse than the unoptimized version of bubble sort. I goes forth and back, which takes more time. Thanks!
            $endgroup$
            – Ademola Adegbuyi
            7 hours ago





            $begingroup$
            So, I visualized the execution on pythontutor.com. One should "never" use this. It's worse than the unoptimized version of bubble sort. I goes forth and back, which takes more time. Thanks!
            $endgroup$
            – Ademola Adegbuyi
            7 hours ago





            1




            1




            $begingroup$
            No. One of the defining characteristics of Bubble sort is that it swaps adjacent elements — which is not the case with this code.
            $endgroup$
            – 200_success
            7 hours ago




            $begingroup$
            No. One of the defining characteristics of Bubble sort is that it swaps adjacent elements — which is not the case with this code.
            $endgroup$
            – 200_success
            7 hours ago












            $begingroup$
            @200_success you are absolutely right - about to edit my answer :)
            $endgroup$
            – jvb
            6 hours ago




            $begingroup$
            @200_success you are absolutely right - about to edit my answer :)
            $endgroup$
            – jvb
            6 hours ago












            $begingroup$
            @200_success: The OP's code is actually a (rather inefficient) variant of insertion sort, with some mostly useless extra shuffling of the tail end of the array thrown in.
            $endgroup$
            – Ilmari Karonen
            51 mins ago




            $begingroup$
            @200_success: The OP's code is actually a (rather inefficient) variant of insertion sort, with some mostly useless extra shuffling of the tail end of the array thrown in.
            $endgroup$
            – Ilmari Karonen
            51 mins ago













            1












            $begingroup$

            It's not even obvious at a glance that your algorithm really sorts all inputs correctly. In fact, it does, but proving that takes a bit of thought.



            The key insight is that, at the end of each iteration of the outer loop, the elements at positions from 0 to i will be sorted correctly:



            for (let i = 0; i < array.length; i++) 
            for (let j = 0; j < array.length - 1; j++)
            if (array[j] > array[i])
            [array[i], array[j]] = [array[j], array[i]]


            // Invariant: here array[0] to array[i] will be correctly sorted!



            In particular, this invariant will obviously be true at the end of the first iteration, when i == 0. It is then not hard to inductively show that, if this was true at the end of the previous iteration, then it will remain true (with i now one greater than before) after the next one as well. Thus, at the end of the last iteration, with i == array.length - 1, the whole array will be correctly sorted.




            Actually, to achieve this, we only need to iterate the inner loop up to j == i - 1; the iteration with i == j obviously does nothing useful, and any later iterations of the inner loop have no effect on the invariant. (Those iterations can only swap the element currently at index i with a larger one from the tail end of the array, which will still leave array[i] greater than or equal to all its predecessors.) So we can speed up your algorithm by only iterating the inner loop until j == i:



            for (let i = 0; i < array.length; i++) 
            for (let j = 0; j < i; j++)
            if (array[j] > array[i])
            [array[i], array[j]] = [array[j], array[i]]


            // Invariant: here array[0] to array[i] will be correctly sorted!



            With this optimization, your algorithm can be recognized as a form of insertion sort.




            It's generally not the most efficient form of that algorithm, though, since the inner loop does the insertion of array[i] into its correct position somewhat inefficiently. A somewhat more efficient implementation would be something like this:



            for (let i = 1; i < array.length; i++) 
            let j = i, temp = array[i];
            while (j > 0 && array[j - 1] > temp)
            array[j] = array[j - 1];
            j--;

            if (j < i) array[j] = temp;
            // Invariant: here array[0] to array[i] will be correctly sorted!



            By running the inner loop "backwards" we can stop it as soon as we find an element that's ranked lower than the one we're inserting (thus avoiding lots of needless comparisons, especially if the input array is already mostly sorted), and by saving the element to be inserted in a temporary variable, we can replace the swaps with simple assignments.



            The if (j < i) part of the code above is not really necessary, since if j == i, assigning temp back to array[i] would have no effect. That said, it's generally a useful optimization if integer comparisons are cheaper than array assignments, which is usually the case. The same goes for starting the outer loop from let i = 1 instead of let i = 0; the iteration with i == 0 does nothing anyway, so we can safely skip it!






            share|improve this answer









            $endgroup$

















              1












              $begingroup$

              It's not even obvious at a glance that your algorithm really sorts all inputs correctly. In fact, it does, but proving that takes a bit of thought.



              The key insight is that, at the end of each iteration of the outer loop, the elements at positions from 0 to i will be sorted correctly:



              for (let i = 0; i < array.length; i++) 
              for (let j = 0; j < array.length - 1; j++)
              if (array[j] > array[i])
              [array[i], array[j]] = [array[j], array[i]]


              // Invariant: here array[0] to array[i] will be correctly sorted!



              In particular, this invariant will obviously be true at the end of the first iteration, when i == 0. It is then not hard to inductively show that, if this was true at the end of the previous iteration, then it will remain true (with i now one greater than before) after the next one as well. Thus, at the end of the last iteration, with i == array.length - 1, the whole array will be correctly sorted.




              Actually, to achieve this, we only need to iterate the inner loop up to j == i - 1; the iteration with i == j obviously does nothing useful, and any later iterations of the inner loop have no effect on the invariant. (Those iterations can only swap the element currently at index i with a larger one from the tail end of the array, which will still leave array[i] greater than or equal to all its predecessors.) So we can speed up your algorithm by only iterating the inner loop until j == i:



              for (let i = 0; i < array.length; i++) 
              for (let j = 0; j < i; j++)
              if (array[j] > array[i])
              [array[i], array[j]] = [array[j], array[i]]


              // Invariant: here array[0] to array[i] will be correctly sorted!



              With this optimization, your algorithm can be recognized as a form of insertion sort.




              It's generally not the most efficient form of that algorithm, though, since the inner loop does the insertion of array[i] into its correct position somewhat inefficiently. A somewhat more efficient implementation would be something like this:



              for (let i = 1; i < array.length; i++) 
              let j = i, temp = array[i];
              while (j > 0 && array[j - 1] > temp)
              array[j] = array[j - 1];
              j--;

              if (j < i) array[j] = temp;
              // Invariant: here array[0] to array[i] will be correctly sorted!



              By running the inner loop "backwards" we can stop it as soon as we find an element that's ranked lower than the one we're inserting (thus avoiding lots of needless comparisons, especially if the input array is already mostly sorted), and by saving the element to be inserted in a temporary variable, we can replace the swaps with simple assignments.



              The if (j < i) part of the code above is not really necessary, since if j == i, assigning temp back to array[i] would have no effect. That said, it's generally a useful optimization if integer comparisons are cheaper than array assignments, which is usually the case. The same goes for starting the outer loop from let i = 1 instead of let i = 0; the iteration with i == 0 does nothing anyway, so we can safely skip it!






              share|improve this answer









              $endgroup$















                1












                1








                1





                $begingroup$

                It's not even obvious at a glance that your algorithm really sorts all inputs correctly. In fact, it does, but proving that takes a bit of thought.



                The key insight is that, at the end of each iteration of the outer loop, the elements at positions from 0 to i will be sorted correctly:



                for (let i = 0; i < array.length; i++) 
                for (let j = 0; j < array.length - 1; j++)
                if (array[j] > array[i])
                [array[i], array[j]] = [array[j], array[i]]


                // Invariant: here array[0] to array[i] will be correctly sorted!



                In particular, this invariant will obviously be true at the end of the first iteration, when i == 0. It is then not hard to inductively show that, if this was true at the end of the previous iteration, then it will remain true (with i now one greater than before) after the next one as well. Thus, at the end of the last iteration, with i == array.length - 1, the whole array will be correctly sorted.




                Actually, to achieve this, we only need to iterate the inner loop up to j == i - 1; the iteration with i == j obviously does nothing useful, and any later iterations of the inner loop have no effect on the invariant. (Those iterations can only swap the element currently at index i with a larger one from the tail end of the array, which will still leave array[i] greater than or equal to all its predecessors.) So we can speed up your algorithm by only iterating the inner loop until j == i:



                for (let i = 0; i < array.length; i++) 
                for (let j = 0; j < i; j++)
                if (array[j] > array[i])
                [array[i], array[j]] = [array[j], array[i]]


                // Invariant: here array[0] to array[i] will be correctly sorted!



                With this optimization, your algorithm can be recognized as a form of insertion sort.




                It's generally not the most efficient form of that algorithm, though, since the inner loop does the insertion of array[i] into its correct position somewhat inefficiently. A somewhat more efficient implementation would be something like this:



                for (let i = 1; i < array.length; i++) 
                let j = i, temp = array[i];
                while (j > 0 && array[j - 1] > temp)
                array[j] = array[j - 1];
                j--;

                if (j < i) array[j] = temp;
                // Invariant: here array[0] to array[i] will be correctly sorted!



                By running the inner loop "backwards" we can stop it as soon as we find an element that's ranked lower than the one we're inserting (thus avoiding lots of needless comparisons, especially if the input array is already mostly sorted), and by saving the element to be inserted in a temporary variable, we can replace the swaps with simple assignments.



                The if (j < i) part of the code above is not really necessary, since if j == i, assigning temp back to array[i] would have no effect. That said, it's generally a useful optimization if integer comparisons are cheaper than array assignments, which is usually the case. The same goes for starting the outer loop from let i = 1 instead of let i = 0; the iteration with i == 0 does nothing anyway, so we can safely skip it!






                share|improve this answer









                $endgroup$



                It's not even obvious at a glance that your algorithm really sorts all inputs correctly. In fact, it does, but proving that takes a bit of thought.



                The key insight is that, at the end of each iteration of the outer loop, the elements at positions from 0 to i will be sorted correctly:



                for (let i = 0; i < array.length; i++) 
                for (let j = 0; j < array.length - 1; j++)
                if (array[j] > array[i])
                [array[i], array[j]] = [array[j], array[i]]


                // Invariant: here array[0] to array[i] will be correctly sorted!



                In particular, this invariant will obviously be true at the end of the first iteration, when i == 0. It is then not hard to inductively show that, if this was true at the end of the previous iteration, then it will remain true (with i now one greater than before) after the next one as well. Thus, at the end of the last iteration, with i == array.length - 1, the whole array will be correctly sorted.




                Actually, to achieve this, we only need to iterate the inner loop up to j == i - 1; the iteration with i == j obviously does nothing useful, and any later iterations of the inner loop have no effect on the invariant. (Those iterations can only swap the element currently at index i with a larger one from the tail end of the array, which will still leave array[i] greater than or equal to all its predecessors.) So we can speed up your algorithm by only iterating the inner loop until j == i:



                for (let i = 0; i < array.length; i++) 
                for (let j = 0; j < i; j++)
                if (array[j] > array[i])
                [array[i], array[j]] = [array[j], array[i]]


                // Invariant: here array[0] to array[i] will be correctly sorted!



                With this optimization, your algorithm can be recognized as a form of insertion sort.




                It's generally not the most efficient form of that algorithm, though, since the inner loop does the insertion of array[i] into its correct position somewhat inefficiently. A somewhat more efficient implementation would be something like this:



                for (let i = 1; i < array.length; i++) 
                let j = i, temp = array[i];
                while (j > 0 && array[j - 1] > temp)
                array[j] = array[j - 1];
                j--;

                if (j < i) array[j] = temp;
                // Invariant: here array[0] to array[i] will be correctly sorted!



                By running the inner loop "backwards" we can stop it as soon as we find an element that's ranked lower than the one we're inserting (thus avoiding lots of needless comparisons, especially if the input array is already mostly sorted), and by saving the element to be inserted in a temporary variable, we can replace the swaps with simple assignments.



                The if (j < i) part of the code above is not really necessary, since if j == i, assigning temp back to array[i] would have no effect. That said, it's generally a useful optimization if integer comparisons are cheaper than array assignments, which is usually the case. The same goes for starting the outer loop from let i = 1 instead of let i = 0; the iteration with i == 0 does nothing anyway, so we can safely skip it!







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered 54 mins ago









                Ilmari KaronenIlmari Karonen

                1,855915




                1,855915




















                    Ademola Adegbuyi is a new contributor. Be nice, and check out our Code of Conduct.









                    draft saved

                    draft discarded


















                    Ademola Adegbuyi is a new contributor. Be nice, and check out our Code of Conduct.












                    Ademola Adegbuyi is a new contributor. Be nice, and check out our Code of Conduct.











                    Ademola Adegbuyi is a new contributor. Be nice, and check out our Code of Conduct.














                    Thanks for contributing an answer to Code Review Stack Exchange!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid


                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.

                    Use MathJax to format equations. MathJax reference.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function ()
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f217017%2fpossibly-bubble-sort-algorithm%23new-answer', 'question_page');

                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Magento 2 duplicate PHPSESSID cookie when using session_start() in custom php scriptMagento 2: User cant logged in into to account page, no error showing!Magento duplicate on subdomainGrabbing storeview from cookie (after using language selector)How do I run php custom script on magento2Magento 2: Include PHP script in headerSession lock after using Cm_RedisSessionscript php to update stockMagento set cookie popupMagento 2 session id cookie - where to find it?How to import Configurable product from csv with custom attributes using php scriptMagento 2 run custom PHP script

                    Can not update quote_id field of “quote_item” table magento 2Magento 2.1 - We can't remove the item. (Shopping Cart doesnt allow us to remove items before becomes empty)Add value for custom quote item attribute using REST apiREST API endpoint v1/carts/cartId/items always returns error messageCorrect way to save entries to databaseHow to remove all associated quote objects of a customer completelyMagento 2 - Save value from custom input field to quote_itemGet quote_item data using quote id and product id filter in Magento 2How to set additional data to quote_item table from controller in Magento 2?What is the purpose of additional_data column in quote_item table in magento2Set Custom Price to Quote item magento2 from controller

                    How to solve knockout JS error in Magento 2 Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern) Announcing the arrival of Valued Associate #679: Cesar Manara Unicorn Meta Zoo #1: Why another podcast?(Magento2) knockout.js:3012 Uncaught ReferenceError: Unable to process bindingUnable to process binding Knockout.js magento 2Cannot read property `scopeLabel` of undefined on Product Detail PageCan't get Customer Data on frontend in Magento 2Magento2 Order Summary - unable to process bindingKO templates are not loading in Magento 2.1 applicationgetting knockout js error magento 2Product grid not load -— Unable to process binding Knockout.js magento 2Product form not loaded in magento2Uncaught ReferenceError: Unable to process binding “if: function()return (isShowLegend()) ” magento 2