Is it possible to sort an array by making the repeated elements in the last?
2 views (last 30 days)
Show older comments
Mohammad Ayoub
on 21 Feb 2018
Commented: Mohammad Ayoub
on 21 Feb 2018
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
0 Comments
Accepted Answer
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
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!).
More Answers (2)
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
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)];
0 Comments
See Also
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!