<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: sort code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Sat, 17 May 2008 11:47:09 GMT</pubDate>
    <description>DZone Snippets: sort code</description>
    <item>
      <title>Merge-sort</title>
      <link>http://snippets.dzone.com/posts/show/4585</link>
      <description>Implements the classic Merge-sort algorithm.&lt;br /&gt;&lt;br /&gt;Time: theta(lg(n))&lt;br /&gt;Space: theta(n)&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;#include &lt;stdlib.h&gt;&lt;br /&gt;#include &lt;string.h&gt;&lt;br /&gt;&lt;br /&gt;void printv(char* in, int *v, int n) {&lt;br /&gt;	printf("%s", in);&lt;br /&gt;	int i = 0;&lt;br /&gt;	for (; i &lt; n; ++i)&lt;br /&gt;		printf("%d ", v[i]);&lt;br /&gt;	printf("\n");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void merge(int *v, int p, int q, int r) {&lt;br /&gt;	int i = p;&lt;br /&gt;	int j = q + 1;&lt;br /&gt;	&lt;br /&gt;	int *tmp = (int*)malloc((r - p + 1) * sizeof(int));&lt;br /&gt;	int k = 0;&lt;br /&gt;	&lt;br /&gt;	while ((i &lt;= q) &amp;&amp; (j &lt;= r)) {&lt;br /&gt;		if (v[i] &lt; v[j])&lt;br /&gt;			tmp[k++] = v[i++];&lt;br /&gt;		else&lt;br /&gt;			tmp[k++] = v[j++];&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	while (i &lt;= q)&lt;br /&gt;		tmp[k++] = v[i++];&lt;br /&gt;	&lt;br /&gt;	while (j &lt;= r)&lt;br /&gt;		tmp[k++] = v[j++];&lt;br /&gt;	&lt;br /&gt;	memcpy(v + p, tmp, (r - p + 1) * sizeof(int));&lt;br /&gt;	free(tmp);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void mergeS(int *v, int p, int r) {&lt;br /&gt;	if (p &lt; r) {&lt;br /&gt;		int q = (p + r) / 2;&lt;br /&gt;		mergeS(v, p, q);&lt;br /&gt;		mergeS(v, q + 1, r);&lt;br /&gt;		merge(v, p, q, r);&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(int argc, char *argv[]) {&lt;br /&gt;	int n = 10;&lt;br /&gt;	int v[] = {9, 8, 7, 6, 5, 5, 4, 3, 2, 1};&lt;br /&gt;	&lt;br /&gt;	printv("V: ", v, n);&lt;br /&gt;	mergeS(v, 0, n - 1);&lt;br /&gt;	printv("V: ", v, n);&lt;br /&gt;	&lt;br /&gt;	return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 28 Sep 2007 06:40:13 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4585</guid>
      <author>scvalex (Alexandru Scvortov)</author>
    </item>
    <item>
      <title>Sort generic list</title>
      <link>http://snippets.dzone.com/posts/show/4114</link>
      <description>&lt;code&gt;&lt;br /&gt;public class Item&lt;br /&gt;{&lt;br /&gt; public Item(string term, int freq)&lt;br /&gt; {&lt;br /&gt;  _term = term;&lt;br /&gt;  _freq = freq;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private string _term;&lt;br /&gt; public string Term&lt;br /&gt; {&lt;br /&gt;  get { return _term; }&lt;br /&gt;  set { _term = value; }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;  private int _freq;&lt;br /&gt;  public int Freq&lt;br /&gt;  {&lt;br /&gt;   get { return _freq; }&lt;br /&gt;   set { _freq = value; }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public class ItemComparer:IComparer&lt;Item&gt;&lt;br /&gt; {&lt;br /&gt;  #region IComparer&lt;Item&gt; Members&lt;br /&gt;&lt;br /&gt;  public int Compare(Item x, Item y)&lt;br /&gt;  {&lt;br /&gt;   return y.Freq - x.Freq; //descending sort&lt;br /&gt;   //return x.Freq - y.Freq; //ascending sort&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  #endregion&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;static void Main()&lt;br /&gt;{&lt;br /&gt; List&lt;Item&gt; items = new List&lt;Item&gt;();&lt;br /&gt; ....&lt;br /&gt; items.Sort(new ItemComparer());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 07 Jun 2007 19:06:38 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4114</guid>
      <author>mstampar (Miroslav Stampar)</author>
    </item>
    <item>
      <title>C - Insertion sort</title>
      <link>http://snippets.dzone.com/posts/show/3972</link>
      <description>Classic implementation of the Insertion Sort algorithm.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;void isort_c(unsigned *a, int n) {&lt;br /&gt;  int k;&lt;br /&gt;  for (k = 1; k &lt; n; ++k) {&lt;br /&gt;    int key = a[k];&lt;br /&gt;    int i = k - 1;&lt;br /&gt;    while ((i &gt;= 0) &amp;&amp; (key &lt; a[i])) {&lt;br /&gt;      a[i + 1] = a[i];&lt;br /&gt;      --i;&lt;br /&gt;    }&lt;br /&gt;    a[i + 1] = key;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Wed, 09 May 2007 08:32:32 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3972</guid>
      <author>scvalex (Alexandru Scvortov)</author>
    </item>
    <item>
      <title>Sort by frequency and order in a list</title>
      <link>http://snippets.dzone.com/posts/show/3688</link>
      <description>// You have an array. For eg [23,12,45,23,9,23,45]. Now you have to print the elements in the order of decreasing frequency, and the same no of times as it is coming in the imput aray. The output for this eg would be 23[3]45[2]12[1]9[1].If frequency of two elements is equal, they should come in the same order as they are coming in the input array.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;struct Node&lt;br /&gt;{&lt;br /&gt;    int element;&lt;br /&gt;    int frequency;&lt;br /&gt;    int order;&lt;br /&gt;    struct Node *next;&lt;br /&gt;    struct Node *prev;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;class FreqList {&lt;br /&gt;&lt;br /&gt; public:&lt;br /&gt;    FreqList();&lt;br /&gt;    virtual ~FreqList();&lt;br /&gt;    virtual void addElement(int newEl);&lt;br /&gt;    virtual void Print();&lt;br /&gt;    virtual void createSorted();&lt;br /&gt;    virtual void printSorted();&lt;br /&gt;&lt;br /&gt; private:&lt;br /&gt;    void addAtEnd(int val, int freq, int order);&lt;br /&gt;    Node* findElement(int val); &lt;br /&gt;    Node* partition(Node *head, Node *tail, int pivot);&lt;br /&gt;    bool  deleteAfter(Node *p, int &amp;val, int &amp;freq, int &amp;order);&lt;br /&gt;    void insertSorted(int val, int freq, int order);&lt;br /&gt;    void addAfter(Node *p, int val, int freq, int order);&lt;br /&gt;    bool deleteFirst(int &amp;val,int &amp;freq, int &amp;order);&lt;br /&gt;    int orderOfElement;&lt;br /&gt;    int numElements;&lt;br /&gt;&lt;br /&gt;    Node *dummy;&lt;br /&gt;    Node *dummySorted;&lt;br /&gt;    Node *tail;&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;#include "FreqList.h"&lt;br /&gt;#include &lt;time.h&gt;&lt;br /&gt;#include &lt;stdlib.h&gt;&lt;br /&gt;&lt;br /&gt;FreqList::FreqList() {&lt;br /&gt;    dummy = new Node;&lt;br /&gt;    dummy-&gt;next = NULL;&lt;br /&gt;    tail = dummy;&lt;br /&gt;    dummySorted = new Node;&lt;br /&gt;    dummySorted-&gt;next = NULL;&lt;br /&gt;    numElements = 0;&lt;br /&gt;    orderOfElement = 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;FreqList::~FreqList() {&lt;br /&gt;    //lot of cleanup to be done&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void FreqList::addAtEnd(int val, int freq, int order) {&lt;br /&gt;    Node *temp = new Node;&lt;br /&gt;    temp-&gt;element = val;&lt;br /&gt;    temp-&gt;frequency = freq;&lt;br /&gt;    temp-&gt;order = order;&lt;br /&gt;    temp-&gt;next = NULL;&lt;br /&gt;&lt;br /&gt;    if(tail != NULL) {&lt;br /&gt;	tail-&gt;next = temp;&lt;br /&gt;	tail = temp;&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;	printf("Oooops!\n");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* This will return a pointer whose next is the desired node */&lt;br /&gt;Node * FreqList::findElement(int val) {&lt;br /&gt;    Node *temp = dummy;&lt;br /&gt;    while(temp-&gt;next != NULL) {&lt;br /&gt;	if(temp-&gt;next-&gt;element == val)&lt;br /&gt;	    return temp;&lt;br /&gt;	else&lt;br /&gt;	    temp=temp-&gt;next;&lt;br /&gt;    }&lt;br /&gt;    return NULL;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void FreqList::addElement(int newEl) {&lt;br /&gt;    Node *temp;&lt;br /&gt;    ++numElements;&lt;br /&gt;    temp = findElement(newEl);&lt;br /&gt;    if(temp == NULL) {&lt;br /&gt;	//element not found. New element to be added&lt;br /&gt;	addAtEnd(newEl, 1, ++orderOfElement);&lt;br /&gt;	return;&lt;br /&gt;    }&lt;br /&gt;    else {&lt;br /&gt;	if(temp-&gt;next != NULL) {&lt;br /&gt;	    temp-&gt;next-&gt;frequency += 1;&lt;br /&gt;	}&lt;br /&gt;	else&lt;br /&gt;	    printf("Hmmph!\n");&lt;br /&gt;	return;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void FreqList::insertSorted(int val, int freq, int order) {&lt;br /&gt;    Node *p = dummySorted;&lt;br /&gt;    while(p-&gt;next != NULL) {&lt;br /&gt;	if(freq &lt; p-&gt;next-&gt;frequency ) {&lt;br /&gt;	    p = p-&gt;next;&lt;br /&gt;	}&lt;br /&gt;	else if(freq == p-&gt;next-&gt;frequency) {&lt;br /&gt;	    if(order &gt; p-&gt;next-&gt;order) {&lt;br /&gt;		p = p-&gt;next;&lt;br /&gt;	    }&lt;br /&gt;	    else {&lt;br /&gt;		break;&lt;br /&gt;	    }&lt;br /&gt;	}&lt;br /&gt;	else {&lt;br /&gt;	    break;&lt;br /&gt;	}&lt;br /&gt;    }&lt;br /&gt;    addAfter(p, val, freq, order);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void FreqList::createSorted() {&lt;br /&gt;    int val, freq, order;&lt;br /&gt;    Node *temp = dummy;&lt;br /&gt;    while(temp-&gt;next != NULL) {&lt;br /&gt;	val = temp-&gt;next-&gt;element;&lt;br /&gt;	freq = temp-&gt;next-&gt;frequency;&lt;br /&gt;	order = temp-&gt;next-&gt;order;&lt;br /&gt;	insertSorted(val, freq, order);&lt;br /&gt;	temp = temp-&gt;next;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void FreqList::printSorted() {&lt;br /&gt;    Node *temp = dummySorted;&lt;br /&gt;    while(temp-&gt;next != NULL) {&lt;br /&gt;	printf("%d[%d]{%d} ", temp-&gt;next-&gt;element, temp-&gt;next-&gt;frequency, \&lt;br /&gt;	       temp-&gt;next-&gt;order);&lt;br /&gt;	temp = temp-&gt;next;	&lt;br /&gt;    }&lt;br /&gt;    printf("\n");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void FreqList::addAfter(Node *p, int val, int freq, int order) {&lt;br /&gt;    Node *temp = new Node;&lt;br /&gt;    temp-&gt;element = val;&lt;br /&gt;    temp-&gt;frequency = freq;&lt;br /&gt;    temp-&gt;order = order;&lt;br /&gt;&lt;br /&gt;    temp-&gt;next = p-&gt;next;&lt;br /&gt;    p-&gt;next = temp;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void FreqList::Print() {&lt;br /&gt;    Node *temp = dummy;&lt;br /&gt;    while(temp-&gt;next != NULL) {&lt;br /&gt;	printf("%d[%d]{%d} ", temp-&gt;next-&gt;element, temp-&gt;next-&gt;frequency, \&lt;br /&gt;	       temp-&gt;next-&gt;order);&lt;br /&gt;	temp = temp-&gt;next;&lt;br /&gt;    }&lt;br /&gt;    printf("\n");&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;    int arr[] = {12,12,23,45,23,9,23,45};&lt;br /&gt;    int num;&lt;br /&gt;    FreqList *freqList = new FreqList();&lt;br /&gt;&lt;br /&gt;    srand((unsigned)time(0));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    for(int i=0; i&lt;8000; i++)&lt;br /&gt;    {   &lt;br /&gt;        num = (rand()%10)+1;&lt;br /&gt;        //printf("Step: %d El: %d ", i, arr[i] );&lt;br /&gt;        freqList-&gt;addElement(num);&lt;br /&gt;    }   &lt;br /&gt;    freqList-&gt;Print();&lt;br /&gt;    freqList-&gt;createSorted();&lt;br /&gt;    freqList-&gt;printSorted();&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sun, 18 Mar 2007 09:10:26 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3688</guid>
      <author>angshuman (Angshuman)</author>
    </item>
    <item>
      <title>PHP: Sorting an associative array</title>
      <link>http://snippets.dzone.com/posts/show/3554</link>
      <description>This basically sorts an associative array... somethin' like that.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$people = new Array();&lt;br /&gt;&lt;br /&gt;$people[0]['id'] = 1;&lt;br /&gt;$people[0]['name'] = "Dave";&lt;br /&gt;$people[1]['id'] = 2;&lt;br /&gt;$people[1]['name'] = "Alex";&lt;br /&gt;$people[2]['id'] = 3;&lt;br /&gt;$people[2]['name'] = "Chris";&lt;br /&gt;&lt;br /&gt;function cmp($a, $b)&lt;br /&gt;{&lt;br /&gt;   return strcmp($a['name'], $b['name']);&lt;br /&gt;}&lt;br /&gt;usort($people, "cmp");&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Tue, 20 Feb 2007 15:02:58 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3554</guid>
      <author>alexwilliams (Alex Williams)</author>
    </item>
    <item>
      <title>Sort file by length of lines</title>
      <link>http://snippets.dzone.com/posts/show/3280</link>
      <description>Sort file by length of lines&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;cat $@ | awk '{ print length, $0 }' | sort -n | awk '{$1=""; print $0}'&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sun, 14 Jan 2007 03:41:12 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3280</guid>
      <author>AlpT (AlpT)</author>
    </item>
    <item>
      <title>Perl: Sorted union of two arrays</title>
      <link>http://snippets.dzone.com/posts/show/3056</link>
      <description>Create a union of two arrays and sort the array.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;my @union = array_union_sort(\@first, \@second);&lt;br /&gt;&lt;br /&gt;sub array_union_sort {&lt;br /&gt;    my $aa = shift;&lt;br /&gt;    my $bb = shift;&lt;br /&gt;    my %union;&lt;br /&gt;    my $e;&lt;br /&gt;    foreach $e (@$aa) { $union{$e} = 1; }&lt;br /&gt;    foreach $e (@$bb) { $union{$e} = 1; }&lt;br /&gt;    my @union = keys %union;&lt;br /&gt;    @union = sort { $a &lt;=&gt; $b } @union;&lt;br /&gt;    return @union;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Wed, 29 Nov 2006 12:45:19 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3056</guid>
      <author>nilesh (Nilesh)</author>
    </item>
    <item>
      <title>Sort multiple dimensional arrays by column without the need to extract the column data first.</title>
      <link>http://snippets.dzone.com/posts/show/2977</link>
      <description>A mechanism to sort multidimensional data by columns without the need to extract the column data first.&lt;br /&gt;&lt;br /&gt;The syntax is the same as array_multisort().&lt;br /&gt;&lt;br /&gt;You also have 3 additional parameters you can use:&lt;br /&gt;&lt;br /&gt;AMC_SORT_STRING_CASELESS to sort the strings case insensitively.&lt;br /&gt;AMC_LOSE_ASSOCIATION (the default behaviour) to lose the associations for the array.&lt;br /&gt;AMC_KEEP_ASSOCIATION to keep the associations for the array.&lt;br /&gt;&lt;br /&gt;If your array does not have associated indexes, then you can use column numbers. But watch out. If you also use PHP's constants like SORT_ASC, SORT_DESC, SORT_REGULAR, SORT_NUMERIC or SORT_STRING, then these can be mixed up with column numbers.&lt;br /&gt;So, to remove this problem, I've created copies of these constants:&lt;br /&gt;AMC_SORT_ASC&lt;br /&gt;AMC_SORT_DESC&lt;br /&gt;AMC_SORT_REGULAR&lt;br /&gt;AMC_SORT_NUMERIC&lt;br /&gt;AMC_SORT_STRING&lt;br /&gt;&lt;br /&gt;Other than that, these function work together JUST like array_multisort but sorts using column(s) without the need to first extract the columns into individual arrays.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;?php&lt;br /&gt;/*&lt;br /&gt;(C) UK 2006 Richard Quadling&lt;br /&gt;&lt;br /&gt;This work is licensed under the Creative Commons Attribution 2.5 License.&lt;br /&gt;To view a copy of this license, visit http://creativecommons.org/licenses/by/2.5/ or send a letter to&lt;br /&gt;    Creative Commons,&lt;br /&gt;    543 Howard Street,&lt;br /&gt;    5th Floor,&lt;br /&gt;    San Francisco,&lt;br /&gt;    California,&lt;br /&gt;    94105, USA.&lt;br /&gt;&lt;br /&gt;Version History&lt;br /&gt;&lt;br /&gt;2006/09/20&lt;br /&gt;Removed reliance on PHP's constants as using column numbers conflicted with these constants.&lt;br /&gt;Use AMC_SORT_xxx rather than SORT_xxx.&lt;br /&gt;&lt;br /&gt;2006/08/23&lt;br /&gt;Added CC license&lt;br /&gt;Added notice and error for parameters&lt;br /&gt;&lt;br /&gt;2006/08/22&lt;br /&gt;Fixed local defines to be well out of the way of the ones used by PHP.&lt;br /&gt;&lt;br /&gt;2006/08/07&lt;br /&gt;Created this code based upon work done by KES (http://www.php.net/manual/en/function.array-multisort.php#68452)&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;// AMC defines for keeping association.&lt;br /&gt;define ('AMC_LOSE_ASSOCIATION', 'AMC10001');&lt;br /&gt;define ('AMC_KEEP_ASSOCIATION', 'AMC10002');&lt;br /&gt;&lt;br /&gt;// AMC defines for the global array.&lt;br /&gt;define ('AMC_SORT_ORDER', 'AMC10003');&lt;br /&gt;define ('AMC_SORT_TYPE', 'AMC10004');&lt;br /&gt;&lt;br /&gt;// AMC defines for the sort order.&lt;br /&gt;define ('AMC_SORT_ASC', 'AMC10005');&lt;br /&gt;define ('AMC_SORT_DESC', 'AMC10006');&lt;br /&gt;&lt;br /&gt;// AMC defines for sorting type.&lt;br /&gt;define ('AMC_SORT_REGULAR', 'AMC10007');&lt;br /&gt;define ('AMC_SORT_NUMERIC', 'AMC10008');&lt;br /&gt;define ('AMC_SORT_STRING', 'AMC10009');&lt;br /&gt;define ('AMC_SORT_STRING_CASELESS', 'AMC10010');&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;  * bool array_multisort_column ( array ar1 [, mixed arg [, mixed ... [, array ...]]] )&lt;br /&gt;  **/&lt;br /&gt;function array_multisort_column(array &amp;$a_data, $m_mixed1)&lt;br /&gt;    {&lt;br /&gt;    // Get the parameters and the number of parameters.&lt;br /&gt;    $a_Args = func_get_args();&lt;br /&gt;    $i_Args = func_num_args();&lt;br /&gt;&lt;br /&gt;    // Define a global empty array for the comparison function.&lt;br /&gt;    $GLOBALS['a_AMC_ordering'] = array();&lt;br /&gt;&lt;br /&gt;    // Get the list of columns.&lt;br /&gt;    $a_Columns = array_keys(reset($a_data));&lt;br /&gt;&lt;br /&gt;    // Assume association is NOT kept&lt;br /&gt;    $b_KeepAssociation = False;&lt;br /&gt;&lt;br /&gt;    // Process the parameter list, extracting columns and any applicable settings.&lt;br /&gt;    for($i_Arg = 1 ; $i_Arg &lt; $i_Args ; )&lt;br /&gt;        {&lt;br /&gt;        // Initially we only want to look at columns.&lt;br /&gt;        if (in_array($a_Args[$i_Arg], $a_Columns))&lt;br /&gt;            {&lt;br /&gt;            // Track the column.&lt;br /&gt;            $s_Column = $a_Args[$i_Arg];&lt;br /&gt;&lt;br /&gt;            // Add the column with default settings to the global array.&lt;br /&gt;            $GLOBALS['a_AMC_ordering'][$a_Args[$i_Arg]] = array&lt;br /&gt;                (&lt;br /&gt;                AMC_SORT_ORDER =&gt; AMC_SORT_ASC,&lt;br /&gt;                AMC_SORT_TYPE =&gt; AMC_SORT_REGULAR,&lt;br /&gt;                );&lt;br /&gt;&lt;br /&gt;            // While there are more parameters to process is the next one a controller rather than a column.&lt;br /&gt;            while&lt;br /&gt;                (&lt;br /&gt;&lt;br /&gt;                // There IS a next parameter.&lt;br /&gt;                isset($a_Args[$i_Arg + 1]) &amp;&amp; &lt;br /&gt;&lt;br /&gt;                // It is a controller.&lt;br /&gt;                in_array&lt;br /&gt;                    (&lt;br /&gt;                    $a_Args[$i_Arg + 1], &lt;br /&gt;                    array&lt;br /&gt;                        (&lt;br /&gt;                        AMC_KEEP_ASSOCIATION,&lt;br /&gt;                        AMC_LOSE_ASSOCIATION,&lt;br /&gt;                        AMC_SORT_STRING_CASELESS,&lt;br /&gt;                        AMC_SORT_ASC,&lt;br /&gt;                        AMC_SORT_DESC,&lt;br /&gt;                        AMC_SORT_NUMERIC,&lt;br /&gt;                        AMC_SORT_REGULAR,&lt;br /&gt;                        AMC_SORT_STRING,&lt;br /&gt;                        ), &lt;br /&gt;                    True&lt;br /&gt;                    )&lt;br /&gt;&lt;br /&gt;                )&lt;br /&gt;                {&lt;br /&gt;                // Deal with column sorting order.&lt;br /&gt;                if (&lt;br /&gt;                    in_array&lt;br /&gt;                        (&lt;br /&gt;                        $a_Args[$i_Arg + 1], &lt;br /&gt;                        array&lt;br /&gt;                            (&lt;br /&gt;                            AMC_SORT_ASC, &lt;br /&gt;                            AMC_SORT_DESC&lt;br /&gt;                            ), &lt;br /&gt;                        True&lt;br /&gt;                        )&lt;br /&gt;                    )&lt;br /&gt;                    {&lt;br /&gt;                    $GLOBALS['a_AMC_ordering'][$s_Column][AMC_SORT_ORDER] = $a_Args[$i_Arg + 1];&lt;br /&gt;                    }&lt;br /&gt;                // Deal with column sorting type.&lt;br /&gt;                elseif (&lt;br /&gt;                    in_array&lt;br /&gt;                        (&lt;br /&gt;                        $a_Args[$i_Arg + 1], &lt;br /&gt;                        array&lt;br /&gt;                            (&lt;br /&gt;                            AMC_SORT_REGULAR, &lt;br /&gt;                            AMC_SORT_NUMERIC, &lt;br /&gt;                            AMC_SORT_STRING, &lt;br /&gt;                            AMC_SORT_STRING_CASELESS&lt;br /&gt;                            ), &lt;br /&gt;                        True&lt;br /&gt;                        )&lt;br /&gt;                    )&lt;br /&gt;                    {&lt;br /&gt;                    $GLOBALS['a_AMC_ordering'][$s_Column][AMC_SORT_TYPE] = $a_Args[$i_Arg + 1];&lt;br /&gt;                    }&lt;br /&gt;                // Deal with array association.&lt;br /&gt;                else&lt;br /&gt;                    {&lt;br /&gt;                    $b_KeepAssociation = (AMC_KEEP_ASSOCIATION == $a_Args[$i_Arg + 1]);&lt;br /&gt;                    }&lt;br /&gt;                // Take the next argument out of the picture.&lt;br /&gt;                ++$i_Arg;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        // Allow array association to be defined.&lt;br /&gt;        elseif (&lt;br /&gt;            in_array&lt;br /&gt;                (&lt;br /&gt;                $a_Args[$i_Arg], &lt;br /&gt;                array&lt;br /&gt;                    (&lt;br /&gt;                    AMC_KEEP_ASSOCIATION, &lt;br /&gt;                    AMC_LOSE_ASSOCIATION&lt;br /&gt;                    ), &lt;br /&gt;                True&lt;br /&gt;                )&lt;br /&gt;            )&lt;br /&gt;            {&lt;br /&gt;            $b_KeepAssociation = (AMC_KEEP_ASSOCIATION == $a_Args[$i_Arg]);&lt;br /&gt;            }&lt;br /&gt;        // Ignore sort options as they are not in the right place to be understood.&lt;br /&gt;        elseif (&lt;br /&gt;            in_array&lt;br /&gt;                (&lt;br /&gt;                $a_Args[$i_Arg], &lt;br /&gt;                array&lt;br /&gt;                    (&lt;br /&gt;                    AMC_SORT_REGULAR, &lt;br /&gt;                    AMC_SORT_NUMERIC, &lt;br /&gt;                    AMC_SORT_STRING, &lt;br /&gt;                    AMC_SORT_STRING_CASELESS&lt;br /&gt;                    ), &lt;br /&gt;                True&lt;br /&gt;                )&lt;br /&gt;            )&lt;br /&gt;            {&lt;br /&gt;            trigger_error("Parameter $i_Arg of '{$a_Args[$i_Arg]}' is not applicable and has been ignored.", E_USER_NOTICE);&lt;br /&gt;            }&lt;br /&gt;        // Whatever is left is an error.&lt;br /&gt;        else&lt;br /&gt;            {&lt;br /&gt;            trigger_error("Requested column of '{$a_Args[$i_Arg]}' is not present in the supplied array.", E_USER_ERROR);&lt;br /&gt;            }&lt;br /&gt;        // Get the next argument.&lt;br /&gt;        ++$i_Arg;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    // Determine which usort mechanism (with or without associations).&lt;br /&gt;    $s_Sorter = ($b_KeepAssociation ? 'uasort' : 'usort');&lt;br /&gt;&lt;br /&gt;    // Sort the data and get the result.&lt;br /&gt;    $b_Result = $s_Sorter($a_data, 'array_multisort_column_cmp');&lt;br /&gt;&lt;br /&gt;    // Remove the temporary global array.&lt;br /&gt;    unset($GLOBALS['a_AMC_ordering']);&lt;br /&gt;&lt;br /&gt;    // Return the results&lt;br /&gt;    return $b_Result;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;  * int array_multisort_column_cmp(array a_left, array a_right)&lt;br /&gt;  **/&lt;br /&gt;function array_multisort_column_cmp(array &amp;$a_left, array &amp;$a_right)&lt;br /&gt;    {&lt;br /&gt;    // Assume that the entries are the same.&lt;br /&gt;    $i_Result = 0;&lt;br /&gt;&lt;br /&gt;    // Process each column defined in the global array.&lt;br /&gt;    foreach($GLOBALS['a_AMC_ordering'] as $s_Column =&gt; $a_ColumnData)&lt;br /&gt;        {&lt;br /&gt;        // Handle the different sort types.&lt;br /&gt;        switch ($a_ColumnData[AMC_SORT_TYPE])&lt;br /&gt;            {&lt;br /&gt;            // Numeric.&lt;br /&gt;            case AMC_SORT_NUMERIC :&lt;br /&gt;                $i_ColumnCompareResult = &lt;br /&gt;                    ((intval($a_left[$s_Column]) == intval($a_right[$s_Column])) &lt;br /&gt;                    ? &lt;br /&gt;                        0 &lt;br /&gt;                    : &lt;br /&gt;                        ((intval($a_left[$s_Column]) &lt; intval($a_right[$s_Column])) &lt;br /&gt;                        ? &lt;br /&gt;                            -1 &lt;br /&gt;                        : &lt;br /&gt;                            1&lt;br /&gt;                        )&lt;br /&gt;                    );&lt;br /&gt;                break;&lt;br /&gt;            // Case sensitive strings.&lt;br /&gt;            case AMC_SORT_STRING :&lt;br /&gt;                $i_ColumnCompareResult = strcmp((string)$a_left[$s_Column], (string)$a_right[$s_Column]);&lt;br /&gt;                break;&lt;br /&gt;            // Case insensitive strings.&lt;br /&gt;            case AMC_SORT_STRING_CASELESS :&lt;br /&gt;                $i_ColumnCompareResult = strcasecmp((string)$a_left[$s_Column], (string)$a_right[$s_Column]);&lt;br /&gt;                break;&lt;br /&gt;            // Regular sorting.&lt;br /&gt;            case AMC_SORT_REGULAR :&lt;br /&gt;            default :&lt;br /&gt;                $i_ColumnCompareResult = &lt;br /&gt;                    (($a_left[$s_Column] == $a_right[$s_Column]) &lt;br /&gt;                    ? &lt;br /&gt;                        0 &lt;br /&gt;                    : &lt;br /&gt;                        (($a_left[$s_Column] &lt; $a_right[$s_Column]) &lt;br /&gt;                        ? &lt;br /&gt;                            -1 &lt;br /&gt;                        : &lt;br /&gt;                            1&lt;br /&gt;                        )&lt;br /&gt;                    );&lt;br /&gt;                break;&lt;br /&gt;            }&lt;br /&gt;        // Is the column in the two arrays the same?&lt;br /&gt;        if (0 == $i_ColumnCompareResult)&lt;br /&gt;            {&lt;br /&gt;            // Continue with the next column.&lt;br /&gt;            continue;&lt;br /&gt;            }&lt;br /&gt;        // Are we sorting descending?&lt;br /&gt;        $i_Result = $i_ColumnCompareResult * (($a_ColumnData[AMC_SORT_ORDER] == AMC_SORT_DESC) ? -1 : 1);&lt;br /&gt;&lt;br /&gt;        // As there is a difference, we do not need to continue with the remaining columns.&lt;br /&gt;        break;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    // Return the result.&lt;br /&gt;    return $i_Result;&lt;br /&gt;    }&lt;br /&gt;?&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 06 Nov 2006 18:36:27 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2977</guid>
      <author>RQuadling (Richard Quadling)</author>
    </item>
    <item>
      <title>sort-by-length - sort a series by element length</title>
      <link>http://snippets.dzone.com/posts/show/2770</link>
      <description>&lt;code&gt;&lt;br /&gt;    sort-by-length: func [series] [sort/compare series :cmp-length]&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 02 Oct 2006 23:21:03 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2770</guid>
      <author>gregg.irwin (Gregg Irwin)</author>
    </item>
    <item>
      <title>cmp-length - compare the length of two series and return -1, 0, or 1, to support stable sorts by length</title>
      <link>http://snippets.dzone.com/posts/show/2769</link>
      <description>&lt;code&gt;&lt;br /&gt;    ; Support func for stable sort comparator&lt;br /&gt;    cmp-length: func [a [series!] b [series!] /local len-a len-b] [&lt;br /&gt;        len-a: length? a&lt;br /&gt;        len-b: length? b&lt;br /&gt;        case [&lt;br /&gt;            len-a &lt; len-b [-1]&lt;br /&gt;            len-a &gt; len-b [1]&lt;br /&gt;            len-a = len-b [0]&lt;br /&gt;        ]&lt;br /&gt;    ]&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 02 Oct 2006 23:19:39 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2769</guid>
      <author>gregg.irwin (Gregg Irwin)</author>
    </item>
  </channel>
</rss>
