Сортирање дводимензионалне матрице

Скоро сваки програм који сам написао захтева методу за сортирање дводимензионалног низа ( М x N )  по колони X у одабраном редоследу сортирања, затим по колони Y у одабраном редоследу сортирања, затим по колони Z у изабраном редоследу сортирања ... затим по колони N у изабраном редоследу сортирања. Редослед и број колона које треба сортирати, као и редослед сортирања вредности у колонама, може варирати од случаја до случаја.

За сортирање дводимензионалног низа који садржи различите типове вредности, бројчане, словне, итд., користио сам DataGridView класу и њен DataGridView event handler. Лако је манипулисати подацима на било који начин и брзо сортирање.Чланак о томе можете пронаћи на адреси : How To Sort Two Dimensional Array in Selected Sort Order

Али некада није могуће имплементирати такво решење. Тако да сам одлучио да покушам да напишем своју универзалну методу за сортирање дводимензионалних низова, која би се могла користити за сортирање низова у било којем будућем програму који ћу написати. 

   /// <summary>

   /// Sorts two dimensional array type of string,

   /// by selected culumns, in selected sort order.

   /// Selection Sort Algorithm is implemented

   /// for sorting values inside array.

   /// </summary>

   /// <param name="array">

   /// Two dimensional array, type of string,

   /// contaning values that are going to be sorted.

   /// </param>

   /// <param name="sort_directive">

   /// Two dimensional array, type of int.

   /// First column contains the order of the column indexes

   /// by which the array will be sorted.

   /// Second column contains column sort order.

   /// Sort order for each column is defined by integer values :

   /// -1 - sort column values in Descending sort order

   ///  0 - column is not going to be sorted

   ///  1 - sort column values in Ascending sort order

   /// </param>

   /// <returns>

   /// Sorted array by selected columns in selected sort order.

   /// </returns>

   public string[,] Sort_String(string [,] array, int [,] sort_directive)

   {

       // number of rows inside array

       int array_rows = array.GetLength(0);

       // number of columns inside array

       int array_columns = array.Length/array_rows;

       // number of columns to be sorted

       int sort_directive_columns = sort_directive.GetLength(0);

       //

       for(int i=0;i<array_rows-1;i++)

       {

           for(int j=i+1;j<array_rows;j++)

           {

               for(int c=0;c<sort_directive_columns;c++)

               {

                  //

                  // sort array values in descending sort order

                  //

                  if(sort_directive[c,1]==-1 &&

                     array[i,sort_directive[c,0]].CompareTo(array[j,sort_directive[c,0]])<0)

                  {

                      //

                      // if values are in ascending sort order

                      // swap values

                      //

                      for(int d=0;d<array_columns;d++)

                      {

                          string h = array[j,d];

                          array[j,d]=array[i,d];

                          array[i,d]=h;

                      }

                            

                      break;

                  }

                  //

                  // if values are in correct sort order break

                  //

                  else if(sort_directive[c,1]==-1 &&

                          array[i,sort_directive[c,0]].CompareTo(array[j,sort_directive[c,0]])>0)

                          break;

                  //

                  // sort array values in ascending sort order

                  //

                  else if(sort_directive[c,1]==1 &&

                          array[i,sort_directive[c,0]].CompareTo(array[j,sort_directive[c,0]])>0)

                  {

                      //

                      // if values are in descending sort order

                      // swap values

                      //

                      for(int d=0;d<array_columns;d++)

                      {

                          string h = array[j,d];

                          array[j,d]=array[i,d];

                          array[i,d]=h;

                      }

                            

                      break;

                  }

                  //

                  // if values are in correct sort order break

                  //

                  else if(sort_directive[c,1]==1 &&

                          array[i,sort_directive[c,0]].CompareTo(array[j,sort_directive[c,0]])<0)

                          break;

                  //

                  // if values are equal

                  // select next sort directive

                  //

              }

           }

       }             

       //

       // return sorted array

       //

       return array;

   }

Метода има два параметра :

array - дводимензионални низ типа STRING , који садржи податке које треба сортирати.

sort_directive - дводимензионални низ типа INTEGER, који има само две колоне.

По завршетку рада, метода враћа сортирани низ array на основу вредности у низу sort_directive.

Пример употребе методе :

ТАБЕЛА садржи следеће податке : Име , Презиме и Адресу.

Неопходно је сортирати ТАБЕЛУ по Имену у растућем редоследу, а затим по Презимену у опадајућем редоследу и на крају по Адреси у растућем редоследу.

Декларација и иницијализација вредности ТАБЕЛЕ :

          //

          // Create and fill TABLE

          //

          string [,] TABLE = new string[7,3]

          {

              { "John"     , "Porter"    , "1234 Oak street, Pensacola, FL 32503"         },

              { "John"     , "Porter"    , "1891 3rd Street North Westlake, OH 44145"     },

              { "William"  , "Patterson" , "4534 Virginia Street Dallas, GA 30132"        },

              { "Marry"    , "Cortez"    , "7642 Fairview Avenue Milwaukee, WI 53204"     },

              { "John"     , "Patterson" , "1368 Street Road Morristown, NJ 07960"        },

              { "Elizabet" , "Cortez"    , "3698 Cedar Avenue Saratoga Springs, NY 12886" },

              { "Marry"    , "Mosley"    , "4575 11th Street Sacramento, CA 95820"        }

              

          };

Декларација и иницијализација вредности СОРТ ДИРЕКТИВЕ :

      //

      // Table SORT DIRECTIVE contains order of columns

      // by which array is going to be sorted and sort order

      // for each selected column

      //

      //  0 - do not sort column

      // -1 - sort in Descending order

      //  1 - sort in Ascending order

      //

      int [,] SORT_DIRECTIVE=new int[3,2]

      {

          {0,  1},

          {1, -1},

          {2,  1}

      };

Позив методе :

      //

      // Call sort method

      //           

      TABLE = Sort_String(TABLE,SORT_DIRECTIVE);

               

      Резултат :        

                        напомена : Подаци који се виде на слицу су измишљени.

Примењен алгоритам за сортирање података је Selection Sort и у складу с тиме је и брзина сортирања. Програмски код методе може да се промени тако да се сортира дводимензионални низ који садржи другачији тип података, као и да се имплементира другачији алгоритам за сортирање како би метода била ефикаснија. У оквиру прилога се налази комплетан отворени код програма. Неопходан је Мајкрософтов .Нет Фрејмворк 4.0.

Унапредјена верзија са применјеним Quick sort алгоритмом може се наћи на адреси: How to Sort Two-Dimensional Array in C# by Selected Column Index in Selected Column Sort Order - CodeProject 

Све најбоље, Аутор