Clear Filters
Clear Filters

Is it possible to sort an array by making the repeated elements in the last?

2 views (last 30 days)
Greetings.
Consider a vector A = [-2 -2 -1 3 3], is it possible to sort this vector (a generalized method) to [-1 -2 -2 -3 -3]?
The only thing that matters is that the repeated elements are in the last, it doesn't matter what way the repeated elements themselves are sorted (for example, [-1 -2 -2 -3 -3] or [-1 -3 -3 -2 -2] are fine) I just want the distinct value to be on the left before any repeated value.
Thank you in advance,
M. Ayoub

Accepted Answer

Stephen23
Stephen23 on 21 Feb 2018
Edited: Stephen23 on 21 Feb 2018
>> A = [-2,-2,-1,3,3,3,9,9,0,99]
A =
-2 -2 -1 3 3 3 9 9 0 99
>> [cnt,idx] = histc(A,unique(A));
>> [~,idy] = sort(cnt>1);
>> [~,idz] = ismember(idx,idy);
>> [~,ids] = sort(idz);
>> B = A(ids)
B =
-1 0 99 -2 -2 3 3 3 9 9
And
>> A = [-1,-1,-3,-5,-5]
...
B =
-3 -5 -5 -1 -1
  2 Comments
Jan
Jan on 21 Feb 2018
This sorts in unique, twice in sort and again in ismember. In addition the perfectly working histc is deprecated (what a pity!).
Mohammad Ayoub
Mohammad Ayoub on 21 Feb 2018
Thank you Stephen and Jan.
Jan I know your answer is true but I think it is a little advanced for me haha, my code is really small and I am still new to MATLAB, so what Stephen wrote works perfectly fine in my application!
By the way, can anyone explain to me what happened exactly (step by step or write the code again with comments) in the code? If you please, so I can understand it better.
Thank you very much!

Sign in to comment.

More Answers (2)

KSSV
KSSV on 21 Feb 2018
A = [-2 -2 -1 3 3] ;
s = sign(A) ;
[val,idx] = sort(abs(A)) ;
iwant = s(idx).*val
  3 Comments
Mohammad Ayoub
Mohammad Ayoub on 21 Feb 2018
The result I expect is [-3 -1 -1 -5 -5] or [-3 -5 -5 -1 -1]
The important thing is that the -3 (which is not repeated) is in the beginning of the array.
By the way, I am limiting my code to 1 repeated value, there will be no more than one repeated element in the arrays (I think this makes it slightly easier)

Sign in to comment.


Jan
Jan on 21 Feb 2018
Edited: Jan on 21 Feb 2018
A = [-1 -1 -3 -5 -5];
[b, n] = RunLength(sort(A));
m = (n == 1);
result = [b(m), RunLength(b(~m), n(~m)];
If you do not have a C-compiler installed, use RunLength_M from this submission.
Maybe this is faster:
sA = sort(A);
[b, n, index] = RunLength(sA);
mask = false(size(A));
mask(index(n == 1)) = true;
result = [sA(mask), sA(~mask)];

Categories

Find more on Shifting and Sorting Matrices in Help Center and File Exchange

Products

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!