Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Сортировка методом Шейкера


Автор: sasa 4.11.2006, 16:28
Привет всем, у меня вопрос по программе C#. Короче кто - то знает метод Шейкера(он заключается в следующем: проходишь одномерный массив и сразу находишь минимальный и максимальный элементы, затем помещаем мин. элемент  в начало массива, а макс. в конец массива и так далее.)Тавк вот в чём моя проблема? есть программа, но я не знаю как из двумерного массива, который выводится у меня, сделать одномерный и потом провести сортировку методом Шейкера.Помогите пожалуйста!Я должен сдать работу в понедельник!Please....

Код
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.IO;


namespace Laba1
{
    class Program
    {
        static void Main(string[] args)
        {
            string tmp = "";
            int[] tab = new int[120];
            int ti = 0, w = 0;

            //-------------------- FILE
            StreamReader sr = new StreamReader("d:\\a.txt");
            string fromFile = sr.ReadToEnd();

            for (w = 0; w < fromFile.Length; w++)
            {
                if (fromFile[w] != ' ')
                    tmp = string.Concat(tmp, fromFile[w]);
                else
                {
                    tab[ti++] = int.Parse(tmp);
                    tmp = "";
                }
            }

            //----------------------- vivod znacenii iz faila
            int n, m, i = 0, j = 0;
            Console.WriteLine("VVEDITE N");
            n = int.Parse(Console.ReadLine());
            Console.WriteLine("VVEDITE M");
            m = int.Parse(Console.ReadLine());
            int[,] mas = new int[n, m];


            for (int t = 0; t < ti; t++)
            {
                if (t >= n * m)
                    break;
                mas[i, j] = tab[t];


                if (((t + 1) % m) == 0)
                {
                    i++;
                    j = 0;

                }
                else
                {
                    j++;
                }

            }

            Console.WriteLine("vivod massiva iz faila:");
            Console.WriteLine("\n");
            for (i = 0; i < mas.GetLength(0); i++)
            {
                for (j = 0; j < mas.GetLength(1); j++)
                {
                    Console.Write("\t" + mas[i, j]);
                }
                Console.WriteLine();
            }


            //----------------- Summa po stolbthy
            int[] summa = new int[n];
            for (i = 0; i < mas.GetLength(0); i++)
                for (j = 0; j < mas.GetLength(1); j++)
                    summa[i] += mas[i, j];

            Console.Write("\t-------------------------\nSUM:");

            for (j = 0; j < mas.GetLength(0); j++)
            {
                Console.Write("\t" + summa[j]);
            }

            //--------------------- summa po massivu
            long sum = 0;
            foreach (int item in mas)
            {
                sum += item;
            }
            Console.Write("\n\n");
            Console.WriteLine("sum vseh elementov = {0}", sum);
            Console.WriteLine();


            //-------------------SORTIROVKA SHAKER---------------------
            //Console.WriteLine("\n\n");
            //Console.WriteLine("Sortirovka SHAKER: ");
            //int k = 0;
            //for (k = 0; k < n / 2; k++)
            //{
              //  for (i < k; i < n - k; i++)
                //{
                  //  for (j < k; j < n - k; j++)
                   // {
                     //   if (mas[i,j] > max)
                       // {
                       //     max = mas[i,j];
                         //   imax = i;
                      //  }
                       // if (mas[i,j] < min)
                       // {
                          //  min = mas[i,j];
                         //   imin = i;
                      //  }
                  //  }
              //  }
         //       mas[imin] = mas[k];
         //       mas[k] = imin;
         //       mas[imax] = mas[k];
         //       mas[k] = imax;
        //    } 
        //    Console.WriteLine("\n\n");
        //    Console.WriteLine("Otsortirovannii massiv: ");
        //    for (i = 0; i < mas.GetLength(0); i++)
          //  {
          //      for (j = 0; j < mas.GetLength(1); j++)
           //     {
             //       Console.WriteLine("\n\n");
              //      Console.Write("{0}\t", mas[i,j]);
//
  //              }
    //        }
      //      Console.Read();
//
  //          }
        }
//    }


Автор: mr.DUDA 4.11.2006, 17:44

M
mr.DUDA
sasa, на будущее: одна тема - один вопрос. Вынес как отдельную тему.

Автор: archimed7592 5.11.2006, 04:32
sasa, у тебя он изначально одномерный (tab). или я чего-то недопонял? в твоей проге делается жалкая попытка отсортировать 2-умерный массив smile как это я себе представляю с трудом smile попробуй сортировать tab, а потом второй раз переводить его в 2-умерный массив и выводить. правда сортировочко тож хромает...

Автор: archimed7592 5.11.2006, 05:03
хз...наверное, что-то вроде этого:
Код
using System;
using System.IO;


namespace Laba1
{
    class Program
    {
        static void Main(string[] args)
        {
            //-------------------- FILE
            string fromFile;                                            // added

            using (StreamReader sr = new StreamReader("t:\\a.txt"))     // corrected
                fromFile = sr.ReadToEnd();

            string[] tab_s = fromFile.Split(new char[] { ' ' });        // added
            int[] tab = new int[tab_s.Length];                          // added
            for (int i = 0; i < tab_s.Length; ++i)                      // added
                tab[i] = int.Parse(tab_s[i]);                           // added

            //----------------------- vivod znacenii iz faila
            int n, m;                                                   // removed i,j
            Console.WriteLine("VVEDITE N");
            n = int.Parse(Console.ReadLine());
            Console.WriteLine("VVEDITE M");
            m = int.Parse(Console.ReadLine());
            int[,] mas = new int[n, m];


            for (int i = 0, t = 0; i < n && t < tab.Length; ++i)        // added
                for (int j = 0; j < m && t < tab.Length; ++j, ++t)      // added
                    mas[i, j] = tab[t];                                 // added

            Console.WriteLine("vivod massiva iz faila:");
            Console.WriteLine("\n");
            for (int i = 0; i < n; ++i)                                 // corrected
            {
                for (int j = 0; j < m; ++j)                             // corrected
                    Console.Write("\t{0}", mas[i, j]);                  // corrected
                Console.WriteLine();
            }


            //----------------- Summa po stolbthy
            int[] summa = new int[m];
            for (int j = 0; j < m; ++j)                                 // corrected
            {
                summa[j] = 0;                                           // added
                for (int i = 0; i < n; ++i)                             // corrected
                    summa[j] += mas[i, j];
            }

            Console.Write("\t------------------------------------\nSUM:");

            for (int j = 0; j < m; ++j)                                 // corrected
                Console.Write("\t{0}", summa[j]);                       // corrected

            //--------------------- summa po massivu
            long sum = 0;
            foreach (int item in mas)
                sum += item;

            Console.Write("\n\n");
            Console.WriteLine("sum vseh elementov = {0}", sum);
            Console.WriteLine();

            //-------------------SORTIROVKA SHAKER---------------------
            Console.WriteLine("\n\n");
            Console.WriteLine("Sortirovka SHAKER: ");
            for (int k = 0; k < tab.Length / 2; k++)                    // corrected
            {
                int min_val = int.MaxValue;                             // added
                int max_val = int.MinValue;                             // added
                int min_ind = k;                                        // added
                int max_ind = tab.Length - k - 1;                       // added
                for (int i = k; i < tab.Length - k; i++)                // corrected
                {
                    if (tab[i] > max_val)
                    {
                        max_val = tab[i];
                        max_ind = i;
                    }
                    if (tab[i] < min_val)
                    {
                        min_val = tab[i];
                        min_ind = i;
                    }
                }
                if (min_ind != k)                                       // corrected
                {
                    int temp = tab[min_ind];                            // corrected
                    tab[min_ind] = tab[k];                              // corrected
                    tab[k] = temp;                                      // corrected
                }
                if (max_ind != tab.Length - k - 1)                      // corrected
                {
                    int temp = tab[max_ind];                            // corrected
                    tab[max_ind] = tab[tab.Length - k - 1];             // corrected
                    tab[tab.Length - k - 1] = temp;                     // corrected
                }
            }
            Console.WriteLine("\n\n");
            Console.WriteLine("Otsortirovannii massiv: ");
 
            for (int i = 0, t = 0; i < n && t < tab.Length; ++i)        // added
                for (int j = 0; j < m && t < tab.Length; ++j, ++t)      // added
                    mas[i, j] = tab[t];                                 // added

            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < m; j++)
                    Console.Write("\t{0}", mas[i, j]);                  // corrected
                Console.WriteLine();
            }
            Console.ReadKey();                                          // corrected
        }
    }
}

Автор: Sartorius 5.11.2006, 11:48
sasa,  насколько я помню шэйкерная сортировка - это последовательное выполнение одной итерации пузырьковой при смене направлений, а не измененная вставка, которую ты написал. В шэйкере действительно есть смысл при сортировке массива, близкого к упорядоченному.

Автор: sasa 6.11.2006, 12:01
Я только не могу понять, почему она у меня показывает какую-то ошибку?

Добавлено @ 12:02 
Или когда я запускаю, у меня не отображаются запуск других методов, например VVedite N и M

Добавлено @ 12:09 
Нет я читаю из файла двумерный массив, потом надо все эти элементы расположить в виде одномерного массива в одну строчку и поставить min i max на концах одномерного массива, и так для всех. Пожалуйста, помогите, я лабу должен сдать в 14.00!

Автор: sasa 6.11.2006, 12:23
Ребята всё не надо, спасибо огромное, всё пошло! Моё спасибо не имеет границ!Удачи вам!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)