Can I make this sort at insertion faster?











up vote
0
down vote

favorite












I'm attempting to sort an array at the initial insertion of a value.
I tried to think "binary search", except with sorting, where I'm searching for the correct insertion point. I guess you can call it a binary sort, but its hardly that. It works just fine, but I wish it was faster. The slowest part of the algorithm is repositioning the previously inserted values.



I understand that there are already things in place that do what I'm trying to do. This was completely for the mental exercise. That being said, here's the code...



public void insert(int insertion) {
int topEnd = nElem - 1;
int bottomEnd = 0;
int halfway;
if (nElem == 0) {
array[0] = insertion;
} else
while (true) {
halfway = (topEnd + bottomEnd) / 2;


// The following is a loop exiting case If topEnd and bottomEnd point to the same position,
// or if topEnd minus bottomEnd equal -1 then you're ready to insert.

if (topEnd == bottomEnd || topEnd - bottomEnd == -1) {


/* For the following, if the number being inserted is greater, insert in front */

if (insertion > array[halfway]) {
shift(bottomEnd, insertion);
array[halfway + 1] = insertion;
break;

/* For the following, if the number being inserted is lesser, insert behind */

} else if (insertion < array[halfway]) {
shift(bottomEnd, insertion);
array[halfway] = insertion;
break;


/* For the following, if the number being inserted is equal, its a duplicate, insert in behind */

} else if (insertion == array[halfway]) {
shift(bottomEnd, insertion);
array[halfway] = insertion;
break;
}


/* If we're not ready to insert, then we need to shorten our range.
If greater, shorten range by moving the bottom to halfway + 1.
If lesser, shorten the range by moving the top down to halfway - 1. */

} else if (insertion > array[halfway]) {
bottomEnd = halfway + 1;
} else if (insertion < array[halfway]) {
topEnd = halfway - 1;


/* The following is another loop exiting case that's meant to help handle duplicates.
* If this case isn't in here when duplicates of more than two, or when topEnd equals 3, 7, 11, the
* algorithm enters into an infinite loop. When testing this, it happened about 35% of the time.
* */

} else if (insertion == array[halfway]) {
shift(bottomEnd, insertion);
array[halfway] = insertion;
break;
}
}
nElem++;
}


The following is the code for the slowest part of the algorithm. It's the shift method.



private void shift(int position, int value) {
for (int i = nElem; i > position; i--)
array[i] = array[i - 1];
}








share







New contributor




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
























    up vote
    0
    down vote

    favorite












    I'm attempting to sort an array at the initial insertion of a value.
    I tried to think "binary search", except with sorting, where I'm searching for the correct insertion point. I guess you can call it a binary sort, but its hardly that. It works just fine, but I wish it was faster. The slowest part of the algorithm is repositioning the previously inserted values.



    I understand that there are already things in place that do what I'm trying to do. This was completely for the mental exercise. That being said, here's the code...



    public void insert(int insertion) {
    int topEnd = nElem - 1;
    int bottomEnd = 0;
    int halfway;
    if (nElem == 0) {
    array[0] = insertion;
    } else
    while (true) {
    halfway = (topEnd + bottomEnd) / 2;


    // The following is a loop exiting case If topEnd and bottomEnd point to the same position,
    // or if topEnd minus bottomEnd equal -1 then you're ready to insert.

    if (topEnd == bottomEnd || topEnd - bottomEnd == -1) {


    /* For the following, if the number being inserted is greater, insert in front */

    if (insertion > array[halfway]) {
    shift(bottomEnd, insertion);
    array[halfway + 1] = insertion;
    break;

    /* For the following, if the number being inserted is lesser, insert behind */

    } else if (insertion < array[halfway]) {
    shift(bottomEnd, insertion);
    array[halfway] = insertion;
    break;


    /* For the following, if the number being inserted is equal, its a duplicate, insert in behind */

    } else if (insertion == array[halfway]) {
    shift(bottomEnd, insertion);
    array[halfway] = insertion;
    break;
    }


    /* If we're not ready to insert, then we need to shorten our range.
    If greater, shorten range by moving the bottom to halfway + 1.
    If lesser, shorten the range by moving the top down to halfway - 1. */

    } else if (insertion > array[halfway]) {
    bottomEnd = halfway + 1;
    } else if (insertion < array[halfway]) {
    topEnd = halfway - 1;


    /* The following is another loop exiting case that's meant to help handle duplicates.
    * If this case isn't in here when duplicates of more than two, or when topEnd equals 3, 7, 11, the
    * algorithm enters into an infinite loop. When testing this, it happened about 35% of the time.
    * */

    } else if (insertion == array[halfway]) {
    shift(bottomEnd, insertion);
    array[halfway] = insertion;
    break;
    }
    }
    nElem++;
    }


    The following is the code for the slowest part of the algorithm. It's the shift method.



    private void shift(int position, int value) {
    for (int i = nElem; i > position; i--)
    array[i] = array[i - 1];
    }








    share







    New contributor




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






















      up vote
      0
      down vote

      favorite









      up vote
      0
      down vote

      favorite











      I'm attempting to sort an array at the initial insertion of a value.
      I tried to think "binary search", except with sorting, where I'm searching for the correct insertion point. I guess you can call it a binary sort, but its hardly that. It works just fine, but I wish it was faster. The slowest part of the algorithm is repositioning the previously inserted values.



      I understand that there are already things in place that do what I'm trying to do. This was completely for the mental exercise. That being said, here's the code...



      public void insert(int insertion) {
      int topEnd = nElem - 1;
      int bottomEnd = 0;
      int halfway;
      if (nElem == 0) {
      array[0] = insertion;
      } else
      while (true) {
      halfway = (topEnd + bottomEnd) / 2;


      // The following is a loop exiting case If topEnd and bottomEnd point to the same position,
      // or if topEnd minus bottomEnd equal -1 then you're ready to insert.

      if (topEnd == bottomEnd || topEnd - bottomEnd == -1) {


      /* For the following, if the number being inserted is greater, insert in front */

      if (insertion > array[halfway]) {
      shift(bottomEnd, insertion);
      array[halfway + 1] = insertion;
      break;

      /* For the following, if the number being inserted is lesser, insert behind */

      } else if (insertion < array[halfway]) {
      shift(bottomEnd, insertion);
      array[halfway] = insertion;
      break;


      /* For the following, if the number being inserted is equal, its a duplicate, insert in behind */

      } else if (insertion == array[halfway]) {
      shift(bottomEnd, insertion);
      array[halfway] = insertion;
      break;
      }


      /* If we're not ready to insert, then we need to shorten our range.
      If greater, shorten range by moving the bottom to halfway + 1.
      If lesser, shorten the range by moving the top down to halfway - 1. */

      } else if (insertion > array[halfway]) {
      bottomEnd = halfway + 1;
      } else if (insertion < array[halfway]) {
      topEnd = halfway - 1;


      /* The following is another loop exiting case that's meant to help handle duplicates.
      * If this case isn't in here when duplicates of more than two, or when topEnd equals 3, 7, 11, the
      * algorithm enters into an infinite loop. When testing this, it happened about 35% of the time.
      * */

      } else if (insertion == array[halfway]) {
      shift(bottomEnd, insertion);
      array[halfway] = insertion;
      break;
      }
      }
      nElem++;
      }


      The following is the code for the slowest part of the algorithm. It's the shift method.



      private void shift(int position, int value) {
      for (int i = nElem; i > position; i--)
      array[i] = array[i - 1];
      }








      share







      New contributor




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











      I'm attempting to sort an array at the initial insertion of a value.
      I tried to think "binary search", except with sorting, where I'm searching for the correct insertion point. I guess you can call it a binary sort, but its hardly that. It works just fine, but I wish it was faster. The slowest part of the algorithm is repositioning the previously inserted values.



      I understand that there are already things in place that do what I'm trying to do. This was completely for the mental exercise. That being said, here's the code...



      public void insert(int insertion) {
      int topEnd = nElem - 1;
      int bottomEnd = 0;
      int halfway;
      if (nElem == 0) {
      array[0] = insertion;
      } else
      while (true) {
      halfway = (topEnd + bottomEnd) / 2;


      // The following is a loop exiting case If topEnd and bottomEnd point to the same position,
      // or if topEnd minus bottomEnd equal -1 then you're ready to insert.

      if (topEnd == bottomEnd || topEnd - bottomEnd == -1) {


      /* For the following, if the number being inserted is greater, insert in front */

      if (insertion > array[halfway]) {
      shift(bottomEnd, insertion);
      array[halfway + 1] = insertion;
      break;

      /* For the following, if the number being inserted is lesser, insert behind */

      } else if (insertion < array[halfway]) {
      shift(bottomEnd, insertion);
      array[halfway] = insertion;
      break;


      /* For the following, if the number being inserted is equal, its a duplicate, insert in behind */

      } else if (insertion == array[halfway]) {
      shift(bottomEnd, insertion);
      array[halfway] = insertion;
      break;
      }


      /* If we're not ready to insert, then we need to shorten our range.
      If greater, shorten range by moving the bottom to halfway + 1.
      If lesser, shorten the range by moving the top down to halfway - 1. */

      } else if (insertion > array[halfway]) {
      bottomEnd = halfway + 1;
      } else if (insertion < array[halfway]) {
      topEnd = halfway - 1;


      /* The following is another loop exiting case that's meant to help handle duplicates.
      * If this case isn't in here when duplicates of more than two, or when topEnd equals 3, 7, 11, the
      * algorithm enters into an infinite loop. When testing this, it happened about 35% of the time.
      * */

      } else if (insertion == array[halfway]) {
      shift(bottomEnd, insertion);
      array[halfway] = insertion;
      break;
      }
      }
      nElem++;
      }


      The following is the code for the slowest part of the algorithm. It's the shift method.



      private void shift(int position, int value) {
      for (int i = nElem; i > position; i--)
      array[i] = array[i - 1];
      }






      java sorting





      share







      New contributor




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










      share







      New contributor




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








      share



      share






      New contributor




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









      asked 4 mins ago









      Yussuf A Clark

      1




      1




      New contributor




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





      New contributor





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






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



























          active

          oldest

          votes











          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',
          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
          });


          }
          });






          Yussuf A Clark 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%2f209658%2fcan-i-make-this-sort-at-insertion-faster%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown






























          active

          oldest

          votes













          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          Yussuf A Clark is a new contributor. Be nice, and check out our Code of Conduct.










          draft saved

          draft discarded


















          Yussuf A Clark is a new contributor. Be nice, and check out our Code of Conduct.













          Yussuf A Clark is a new contributor. Be nice, and check out our Code of Conduct.












          Yussuf A Clark 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.





          Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


          Please pay close attention to the following guidance:


          • 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.


          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%2f209658%2fcan-i-make-this-sort-at-insertion-faster%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

          404 Error Contact Form 7 ajax form submitting

          How to know if a Active Directory user can login interactively

          TypeError: fit_transform() missing 1 required positional argument: 'X'