Sorting: Difference between revisions

From Rosetta Code
Content added Content deleted
Line 23: Line 23:
'''Interpreter:''' Python 2.4
'''Interpreter:''' Python 2.4


Python's lists have a method for in-place sorting; there's also a built-in <tt>sorted()</tt> method that
Python's lists have a method for in-place sorting; there's also a built-in
can sort any iterable.
<tt>sorted()</tt> method that can sort any iterable.


<!-- NOTE: a single sorted(words, key=len, reverse=True) won't produce the
desired results for strings of equal length -->
# create a sample list
# create a sample list
words = ['Long', 'words', 'are', 'more', 'interesting', 'than', 'short', 'ones']
words = ['Long', 'words', 'are', 'more', 'interesting', 'than', 'short', 'ones']
# order it and keep the result on another variable
# order it and keep the result on another variable
sorted_words = sorted(words, key=len, reverse=True)
sorted_words = sorted(words, key=lambda word: (-len(word), word))
# sorted_words: ['interesting', 'short', 'words', 'Long', 'more', 'ones', 'than', 'are']
# result: ['interesting', 'short', 'words', 'Long', 'more', 'ones', 'than', 'are']
# otherwise
# otherwise
words.sort(key=len, reverse=True)
words.sort(key=lambda word: (-len(word), word))


==[[Ruby]]==
==[[Ruby]]==

Revision as of 11:21, 23 January 2007

Task
Sorting
You are encouraged to solve this task according to the task description, using any language you may know.

Sort an Array of Strings, from large to small and lexicographic for Strings of equal length

Perl

Interpeter: Perl

Numeric sort

my @sorted = sort {$a<=>$b} (3, 6, 4, 5, 2, 7, 1);

Alpha-Numeric sort

my @sorted = sort ('this', 'that', 'and', 'the', 'other');

Numeric sort or Alpha-Numeric sort if a numeric sort cannot be done

# note, this can be a oneliner
my @sorted = sort {
   ($a =~ /^\-?\d+\.?\d*$/ and $b =~ /^\-?\d+\.?\d*$/) ? $a <=> $b : $a cmp $b
} ('this', 'that', 'and', 'the', 'other', 3, 6, 4, 5, 2, 7, 1);

Python

Interpreter: Python 2.4

Python's lists have a method for in-place sorting; there's also a built-in sorted() method that can sort any iterable.

# create a sample list
words = ['Long', 'words', 'are', 'more', 'interesting', 'than', 'short', 'ones']

# order it and keep the result on another variable
sorted_words = sorted(words, key=lambda word: (-len(word), word))

# result: ['interesting', 'short', 'words', 'Long', 'more', 'ones', 'than', 'are']

# otherwise
words.sort(key=lambda word: (-len(word), word))

Ruby

#create a test array
ary=['Long','words','are','more','interesting','than','short','ones']
ary.sort_by {|a| [-a.size,a]}
# => ["interesting", "short", "words", "Long", "more", "ones", "than", "are"]

UNIX Shell

words='Long words are more interesting than short ones'
sorted_words="$(
  for word in $words # doesn't work with ZSH since it won't do field splitting here
  do echo "$word"
  done | sort | \
    while read word
    do echo -n "$word "
    done
  echo
 )"
echo "$sorted_words"

C++

sort an array

 #include <algorithm>
 
 int arr[] = { 3, 8, 5, 2, 9 };
 int arr_length = sizeof(arr)/sizeof(arr[0]);
 std::sort(arr, arr+arr_length);

sort a std-vector

 #include <algorithm>
 #include <vector>
 
 std::vector<int> vec;
 vec.push_back(5);
 vec.push_back(4);
 vec.push_back(7);
 vec.push_back(1);
 std::sort(vec.begin(), vec.end());

Sort an array in a custom way with a function. This also works on std-vectors. Note: of course the function is_bigger should be outside our function.

 #include <algorithm>
 
 bool is_bigger(int a, int b)
 {
   // note: for equal elements it should return false
   return a>b;
 }
 std::sort(arr, arr+arr_length, is_bigger);

Sort an array in a custom way with a function object. This has the advantage that you can give a state to the sorting object. This also works on std-vectors. Note: the struct compare_modulo should be outside our function.

 #include <algorithm>
 
 struct compare_modulo
 {
   int mod;
   compare_modulo(int m): mod(m) {}
   bool operator()(int a, int b) const
   {
     // note: for equal elements it should return false
     return (a%mod)<(b%mod);
   }
 }
 
 std::sort(arr, arr+arr_length, compare_modulo(3));

Sort an array in a stable way. This is different from the other sort in that equal elements stay in the same order as they were before sorting. This is a little slower. This has no use on int's of course, but it may be important with objects. You can also use this with std-vectors, and there is also a version that takes a third argument as the compare object, as above with std::sort.

 #include <algorithm>
 
 int arr[] = { 3, 2, 9, 2, 9 };
 int arr_length = sizeof(arr)/sizeof(arr[0]);
 std::stable_sort(arr, arr+arr_length);