Code covered by the BSD License

### Highlights from sort_nat: Natural Order Sort

5.0

5.0 | 32 ratings Rate this file 110 Downloads (last 30 days) File Size: 2.26 KB File ID: #10959

# sort_nat: Natural Order Sort

03 May 2006 (Updated )

Sort strings in natural order.

### Editor's Notes:

This file was selected as MATLAB Central Pick of the Week

File Information
Description

Natural order sorting sorts strings containing digits in a way such that the numerical value of the digits is taken into account. It is especially useful for sorting file names containing index numbers with different numbers of digits. Often, people will use leading zeros to get the right sort order, but with this function you don't have to do that. For example, with input of

{'file1.txt','file2.txt','file10.txt'}

a normal sort will give you

{'file1.txt','file10.txt','file2.txt'}

whereas, sort_nat will give you

{'file1.txt','file2.txt','file10.txt'}

Acknowledgements
MATLAB release MATLAB 7.0.4 (R14SP2)
19 Feb 2014

thank you very much!
i was typing C=[list.name] and not
C={list.name} which is the right.
thank you very much again!
very usefull function!

19 Feb 2014

Alex, your input has to be a cell array:

>> C = {'1.bmp','10.bmp','11.bmp','2.bmp'};
>> sort_nat(C)
ans =
'1.bmp' '2.bmp' '10.bmp' '11.bmp'

19 Feb 2014
19 Feb 2014

i find this very useful,but i cant use it.

C =

1.bmp10.bmp11.bmp2.bmp

>> [S,INDEX] = sort_nat(C)

Cell contents reference from a non-cell array object.

Error in sort_nat (line 62)

num_val(i,z(i,:)) = sscanf(sprintf('%s ',digruns{i}{:}),'%f');

any help?

11 Nov 2013

Very useful - worked was described! Thanks.

29 Oct 2013

It work well and help a lot. So awesome!!!
Thank you

25 Sep 2013

Thank you so much, saved me a lot of time! Dirk

06 Sep 2013
01 Aug 2013
18 Jul 2013
09 Jul 2013
28 Apr 2013
26 Mar 2013

Sorry, I am a beginner in MATLAB and I am not sure what the input arguments in these function mean. There are many input argument.... I have a struct array (conists of files with names ex.123_1, 123_2, etc) A <3000*1> struct and I want to sort it according to name of files which are there. How shoud I use this function... Please help me.. best wiches Katya

07 Mar 2013

thanks a lot!!! great

30 Jan 2013

Excellent

24 Jan 2013
04 Dec 2012
18 Jul 2012

Just what I needed, thanks!

01 May 2012

I have wasted a lot of time trying to properly sort my image files for my image processing project before I surfed on to this code. And mathworks web tutorial on this is totally flawed. Great work! Certainly deserves a 5 star.

03 Jan 2012

Excellent work. Saved me a much time and headache with some data analysis over here at NASA. Thank you!

03 Jan 2012
28 Jul 2011

This is great! Better to include it in the Matlab!

05 Jul 2011
26 May 2011

Many thanks, save me time and effort to write my own code to crack this problem

27 Apr 2011
10 Feb 2011

Great, works straight off in Octave too.

22 Jan 2011

Douglas Schwarz,
You offered the perfect solution for case-insensitive sorting.
Thank you!

22 Jan 2011

Evgeny, you must be the first person to use descending order and the index. You are quite right, it's a bug and I thank you for identifying it. I fixed it in a slightly different way and just uploaded the new version.

To do case-insensitive sorting you can just do this:
c = {'a1', 'a2', 'a10', 'b1', 'X1', 'A10'};
[unused,index] = sort_nat(lower(c));
cs = c(index);

I want sort_nat to work the same way as sort and since sort doesn't do case-insensitive sorting I left that out of sort_nat as well.

Regards,
Doug

22 Jan 2011

This code not entirely correct:
if strcmpi(mode,'ascend')
cs = c(index);
else
cs = c(index(end:-1:1));
end

Output argument INDEX does not change depending on the sort order.

Better to do so:
if strcmpi(mode, 'descend')
index = flipud(index);
end
cs = c(index);
index = reshape(index, size(cs)); % same as C array dimension

22 Jan 2011

Hi! Very good function and coding!
I could not write such a elegant and fast function. :)

One question:
You would not want to make sort mode a case-insensitive?

For Example:
c = {'a1', 'a2', 'a10', 'b1', 'X1', 'A10'}

Case-sensetive sort:
cs = {'A10', 'X1', 'a1', 'a2', 'a10', 'b1'}

Case-insensitive sort:
cs = {'a1', 'a2', 'a10', 'A10', 'b1', 'X1'}

12 Sep 2010
22 Aug 2010

Excellent. 5 stars.

I think I ran into the need for a descending sort because I was looking to search through various files with timestamps in their name for the most recent entry (of something-or-other).

Anyway, good work.

06 Apr 2010

Pete, I'm not sure sorting in descending order will be used very often, but, as you say, it's easy to add so why not? I chose to do it in a slightly different way, but it works the way you want. Thanks for the suggestion. Update should appear soon.

01 Apr 2010

Good work.

Is it just me though or would this not benefit from being able to specify the direction? This would be as simple as:

function [cs,index] = sort_nat(c,varargin)

... <entire code>

if nargin>1
if strcmpi(varargin{1},'descend')
index = flipud(index);
cs = c(index);
end
end

09 Dec 2008

I wish I'd found this sooner!

29 Aug 2008

Nifty, thanks.

25 May 2008

Thanks

02 Aug 2007

Nice! Thanks

14 Dec 2006

Great, just what I needed.

13 Sep 2006

Perfect. Should be included in R2007a!

26 Jun 2006

Great, much better than another file on the exchange "sortn", sortn froze when trying to sort over 6000 strings, this sort did it just fine in about a second.

05 Nov 2008

Steve Herman identified an obscure bug (sorting a cell array of one string which has no numeric characters) which has now been fixed. Thank you Steve!

06 Apr 2010

Added ability to sort in descending order.

22 Jan 2011

Fixed bug identified by Evgeny Pr. (Thanks!)