Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6376577
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 25, 20262026-05-25T01:45:48+00:00 2026-05-25T01:45:48+00:00

This was a question in one my friend’s programming class. Q. How do you

  • 0

This was a question in one my friend’s programming class.

Q. How do you sort an array of ints and then arrange them such that all duplicate elements appear at the end of the array?

For example, given the input

{5, 2, 7, 6, 1, 1, 5, 6, 2}

The output would be

{1, 2, 5, 6, 7, 1, 2, 5, 6}

Note that the numbers are sorted and duplicate numbers are after 7, which is the maximum in the array.

This has to be achieved with out using any Java library packages/utils.

I suggested to sort the array first using insertion or bubble sort, and then go over the array, perform something like the following :

for (int i = 0; i < nums.length - 2; i++) {
    for (int j = i + 1; j < nums.length; j++) {
        //current and next are same, move elements up
        //and place the next number at the end.
        if (nums[i] == nums[j]) {
            int temp = nums[j];
            for (int k = j; k < nums.length - 1; k++) {
                nums[k] = nums[k + 1];
            }
            nums[nums.length - 1] = temp;
            break;
        }
    }
}

I tried this myself later (and that is how the code above) – As I try this out, I think this could be achieved by using less code, be more efficiently. And may be I gave a wrong advice.

Any thoughts?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-25T01:45:49+00:00Added an answer on May 25, 2026 at 1:45 am

    Depending on the parameters of your problem, there are many approaches to solving this.

    If you are not allowed to use O(n) external memory, then one option would be to use a standard sorting algorithm to sort the array in-place in O(n log n) time, then to run a second pass over it to move the duplicates to the end (as you’ve suggested). The code you posted above takes O(n2) time, but I think that this step can be done in O(n log n) time using a slightly more complicated algorithm. The idea works in two steps. In the first step, in O(n log n) time you bring all non-duplicated elements to the front in sorted order and bring all the duplicates to the back in non-sorted order. Once you’ve done that, you then sort the back half of the array in O(n log n) time using the sorting algorithm from the first step.

    I’m not going to go into the code to sort the array. I really love sorting, but there are so many other good resources on how to sort arrays in-place that it’s not a good use of my time/space here to go into them. If it helps, here’s links to Java implementations of heapsort, quicksort, and smoothsort, all of which runs in O(n log n) time. Heapsort and smoothsort use only O(1) external memory, while quicksort can use O(n) in the worst case (though good implementations can limit this to O(log n) using cute tricks).

    The interesting code is the logic to bring all the non-duplicated elements to the front of the range. Intuitively, the code works by storing two pointers – a read pointer and a write pointer. The read pointer points to the next element to read, while the write pointer points to the location where the next unique element should be placed. For example, given this array:

    1 1 1 1 2 2 3 4 5 5
    

    We start with the read and write pointers initially pointing at 1:

    write  v
           1 1 1 1 2 2 3 4 5 5
    read   ^
    

    Next, we skip the read pointer ahead to the next element that isn’t 1. This finds 2:

    write  v
           1 1 1 1 2 2 3 4 5 5
    read           ^
    

    Then, we bump the write pointer to the next location:

    write    v
           1 1 1 1 2 2 3 4 5 5
    read           ^
    

    Now, we swap the 2 into the spot held by the write pointer:

    write    v
           1 2 1 1 1 2 3 4 5 5
    read           ^
    

    advance the read pointer to the next value that isn’t 2:

    write    v
           1 2 1 1 1 2 3 4 5 5
    read               ^
    

    then advance the write pointer:

    write      v
           1 2 1 1 1 2 3 4 5 5
    read               ^
    

    Again, we exchange the values pointed at by ‘read’ and ‘write’ and move the write pointer forward, then move the read pointer to the next unique value:

    write        v
           1 2 3 1 1 2 1 4 5 5
    read                 ^
    

    Once more yields

    write          v
           1 2 3 4 1 2 1 1 5 5
    read                   ^
    

    and the final iteration gives

    write            v
           1 2 3 4 5 2 1 1 1 5
    read                      ^
    

    If we now sort from the write pointer to the read pointer, we get

    write            v
           1 2 3 4 5 1 1 1 2 5
    read                      ^
    

    and bingo! We’ve got the answer we’re looking for.

    In (untested, sorry…) Java code, this fixup step might look like this:

    int read = 0;
    int write = 0;
    
    while (read < array.length) {
         /* Swap the values pointed at by read and write. */
         int temp = array[write];
         array[write] = array[read];
         array[read] = temp;
    
         /* Advance the read pointer forward to the next unique value.  Since we
          * moved the unique value to the write location, we compare values
          * against array[write] instead of array[read].
          */
         while (read < array.length && array[write] == array[read])
             ++ read;
    
         /* Advance the write pointer. */
         ++ write;
    }
    

    This algorithm runs in O(n) time, which leads to an overall O(n log n) algorithm for the problem. Since the reordering step uses O(1) memory, the overall memory usage would be either O(1) (for something like smoothsort or heapsort) or O(log n) (for something like quicksort).

    EDIT: After talking this over with a friend, I think that there is a much more elegant solution to the problem based on a modification of quicksort. Typically, when you run quicksort, you end up partitioning the array into three regions:

     +----------------+----------------+----------------+
     | values < pivot | values = pivot | values > pivot |
     +----------------+----------------+----------------+
    

    The recursion then sorts the first and last regions to put them into sorted order. However, we can modify this for our version of the problem. We’ll need as a primitive the rotation algorithm, which takes two adjacent blocks of values in an array and exchanges them in O(n) time. It does not change the relative order of the elements in those blocks. For example, we could use rotation to convert the array

    1 2 3 4 5 6 7 8
    

    into

    3 4 5 6 7 8 1 2
    

    and can do so in O(n) time.

    The modified version of quicksort would work by using the Bentley-McIlroy three-way partition algortihm (described here) to, using O(1) extra space, rearrange the array elements into the configuration shown above. Next, we apply a rotation to reorder the elements so that they look like this:

     +----------------+----------------+----------------+
     | values < pivot | values > pivot | values = pivot |
     +----------------+----------------+----------------+
    

    Next, we perform a swap so that we move exactly one copy of the pivot element into the set of elements at least as large as the pivot. This may have extra copies of the pivot behind. We then recursively apply the sorting algorithm to the < and > ranges. When we do this, the resulting array will look like this:

     +---------+-------------+---------+-------------+---------+
     | < pivot | dup < pivot | > pivot | dup > pivot | = pivot |
     +---------+-------------+---------+-------------+---------+
    

    We then apply two rotations to the range to put it into the final order. First, rotate the duplicate values less than the pivot with the values greater than the pivot. This gives

     +---------+---------+-------------+-------------+---------+
     | < pivot | > pivot | dup < pivot | dup > pivot | = pivot |
     +---------+---------+-------------+-------------+---------+
    

    At this point, this first range is the unique elements in ascending order:

     +---------------------+-------------+-------------+---------+
     | sorted unique elems | dup < pivot | dup > pivot | = pivot |
     +---------------------+-------------+-------------+---------+
    

    Finally, do one last rotation of the duplicate elements greater than the pivot and the elements equal to the pivot to yield this:

     +---------------------+-------------+---------+-------------+
     | sorted unique elems | dup < pivot | = pivot | dup > pivot |
     +---------------------+-------------+---------+-------------+
    

    Notice that these last three blocks are just the sorted duplicate values:

     +---------------------+-------------------------------------+
     | sorted unique elems |      sorted duplicate elements      |
     +---------------------+-------------------------------------+
    

    and voila! We’ve got everything in the order we want. Using the same analysis that you’d do for normal quicksort, plus the fact that we’re only doing O(n) work at each level (three extra rotations), this works out to O(n log n) in the best case with O(log n) memory usage. It’s still O(n2) in the worst case with O(log n) memory, but that happens with extremely low probability.

    If you are allowed to use O(n) memory, one option would be to build a balanced binary search tree out of all of the elements that stores key/value pairs, where each key is an element of the array and the value is the number of times it appears. You could then sort the array in your format as follows:

    1. For each element in the array:
      • If that element already exists in the BST, increment its count.
      • Otherwise, add a new node to the BST with that element having count 1.
    2. Do an inorder walk of the BST. When encountering a node, output its key.
    3. Do a second inorder walk of the BST. When encountering a node, if it has count greater than one, output n – 1 copies of that node, where n is the number of times it appears.

    The runtime of this algorithm is O(n log n), but it would be pretty tricky to code up a BST from scratch. It also requires external space, which I’m not sure you’re allowed to do.

    However, if you are allowed external space and the arrays you are sorting are small and contain small integers, you could modify the above approach by using a modified counting sort. Just replace the BST with an array large enough for each integer in the original array to be a key. This reduces the runtime to O(n + k), with memory usage O(k), where k is the largest element in the array.

    Hope this helps!

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

The current top-voted to this question states: Another one that's not so much a
One of my friend was asked this question in an interview - You have
This is related to another question that I had asked Is fb:multi-friend-selector deprecated? .
So I got this question from one of the developers in my team: What
I just saw this question and one of the answers looks really appealing to
This question might make one smile, really, HDD space is as cheap as dirt
This question is related to this one , though I think I was a
This question is related to this one . I have a page table with
This question is similar to this one How do I add options to a
This question is related with one of my earlier questions.. Previous Post In there

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.