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];
}
java sorting
New contributor
add a comment |
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];
}
java sorting
New contributor
add a comment |
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];
}
java sorting
New contributor
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
java sorting
New contributor
New contributor
New contributor
asked 4 mins ago
Yussuf A Clark
1
1
New contributor
New contributor
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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.
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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