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

Why doesn't Newton's third law mean a person bounces back to where they started when they hit the ground?

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

Chess with symmetric move-square

What defenses are there against being summoned by the Gate spell?

Can a German sentence have two subjects?

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?

Should I join office cleaning event for free?

Draw simple lines in Inkscape

Is Social Media Science Fiction?

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

Why is "Reports" in sentence down without "The"

Is there a minimum number of transactions in a block?

What is the offset in a seaplane's hull?

Copycat chess is back

How do we improve the relationship with a client software team that performs poorly and is becoming less collaborative?

Validation accuracy vs Testing accuracy

How did the USSR manage to innovate in an environment characterized by government censorship and high bureaucracy?

Set-theoretical foundations of Mathematics with only bounded quantifiers

If Manufacturer spice model and Datasheet give different values which should I use?

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

How to report a triplet of septets in NMR tabulation?

How can bays and straits be determined in a procedurally generated map?

Extreme, but not acceptable situation and I can't start the work tomorrow morning



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 9 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 10 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
            9 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
            9 hours ago










          • $begingroup$
            @200_success you are absolutely right - about to edit my answer :)
            $endgroup$
            – jvb
            8 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
            2 hours 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
              9 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
              9 hours ago










            • $begingroup$
              @200_success you are absolutely right - about to edit my answer :)
              $endgroup$
              – jvb
              8 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
              2 hours 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
              9 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
              9 hours ago










            • $begingroup$
              @200_success you are absolutely right - about to edit my answer :)
              $endgroup$
              – jvb
              8 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
              2 hours 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 8 hours ago

























            answered 9 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
              9 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
              9 hours ago










            • $begingroup$
              @200_success you are absolutely right - about to edit my answer :)
              $endgroup$
              – jvb
              8 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
              2 hours 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
              9 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
              9 hours ago










            • $begingroup$
              @200_success you are absolutely right - about to edit my answer :)
              $endgroup$
              – jvb
              8 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
              2 hours 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
            9 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
            9 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
            9 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
            9 hours ago












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




            $begingroup$
            @200_success you are absolutely right - about to edit my answer :)
            $endgroup$
            – jvb
            8 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
            2 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
            2 hours 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 2 hours 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

                    منجزی محتویات تیره‌های طایفه منجزی[ویرایش] مشاهیر طایفه منجزی[ویرایش] محل سکونت[ویرایش] پانویس[ویرایش] منابع[ویرایش] منوی ناوبری«نمودار اجتماعی طوایف بختیاری»«BakhtyārBAḴTĪĀRĪ TRIBE»«اسامی طوایف و شعب ایل بختیاری»ووگسترش آن

                    What does the writing on Poe's helmet say? Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern) Favorite questions and answers from first quarter of 2019 Latest Blog Post: Avengers: Endgame PredictionsWhat is the purpose of the blast shield helmet?Why was the Stormtrooper helmet designed this way?What does Kylo Ren place his helmet on?What does the writing on Poe Dameron's flight vest say?Is this Poe Damerons dad? (Kes Dameron)Is Poe Dameron Force-Sensitive?Why is Poe Dameron so shocked in the First Order star destroyer hangar?What does the code breaker's hat say?In “The Last Jedi” was it actually Poe's fault that so much of the resistance died?Did Poe Dameron make custom modifications to his black X-Wing?

                    How to implement Time Range Picker in Magento 2 Admin system.xml? The 2019 Stack Overflow Developer Survey Results Are In Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern)Date field system.xmlMagento 2 - time picker on backend (xml form)How to overwrite System.xml?Magento 2 Pattern Library — Date & Time SelectorsHTTP 500 Error in System ConfigurationMagento 2 - time picker on backend (xml form)Magento 2 Add Datetime picker in system.xmlDate Time picker and time zone woesHow to implement Single Date and Time Picker in Magento 2Custom Module for Custom Column using Plugin Yes/No optionMagento 2 DateTime picker - Limit time selection rangeMagento2 UI Component admin Grid / Listing stuck loading