Реализовать бинарный поиск для переопределенного компаратора - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день, такая проблема: Не могу понять как мне реализовать бинарный поиск для моего переопределенного компаратора. Суть задачи: написать линейный поиск и проверить встроенным бинарным. Вот с бинарным то и проблемы. Коллекция ArrayList.
using System;
using System.Collections;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading.Tasks;
 
namespace ConsoleApplication1
{
    public class Student : IComparable
    {
        /* Переопределяем стандартный метод CompareTo интерфейса IComparable, 
            нужный для вызова метода Sort */
        public int CompareTo(Object rhs)
        {
            Student r = (Student)rhs;
            Int32 ret = this.Name.CompareTo(r.Name);
            if (ret == 0)
            {
                ret = this.Surname.CompareTo(r.Name);
            }
            if (ret == 0)
            {
                ret = this.FatherName.CompareTo(r.FatherName);
            }
            if (ret == 0)
            {
                ret = this.gruppa.CompareTo(r.gruppa);
            }
            return ret;
        }
 
        //обьявление членов класса  
        public string Name;
        public string Surname;
        public string FatherName;
        public int Age;
        public string Pol;
        public double Rez1;
        public double Rez2;
        public double Rez3;
        public int gruppa;
    }
    public class Sort
    {
        static StreamReader read;   //поток для чтения
        static int NumberLines()
        {
            int kol = 0;
            String line;
            while ((line = read.ReadLine()) != null)
            {
                kol++;
            }
            read.Close();
            return kol;
        }
        static void ReadFile(Student[] a)
        {
            char[] delimiters = { ' ' };
            string strfromfile = read.ReadLine();
            string[] line = new string[9];
            int i = 0;
            while (strfromfile != null)
            {
                a[i] = new Student();
                line = strfromfile.Split(delimiters);
                a[i].Name = line[0];
                a[i].Surname = line[1];
                a[i].FatherName = line[2];
                a[i].Age = Convert.ToInt32(line[3]);
                a[i].Pol = line[4];
                a[i].Rez1 = Convert.ToDouble(line[5]);
                a[i].Rez2 = Convert.ToDouble(line[6]);
                a[i].Rez3 = Convert.ToDouble(line[7]);
                a[i].gruppa = Convert.ToInt32(line[8]);
                i++;
                strfromfile = read.ReadLine();
            }
            read.Close();
        }
 
        static void Output(Student[] a)
        {
            foreach (Student i in a)
            {
                Console.Write("{0}  {1}  {2}  {3}  {4}  {5}  {6}  {7}  {8}\n", i.Name, i.Surname, i.FatherName, i.Age, i.Pol, i.Rez1, i.Rez2, i.Rez3, i.gruppa);
            }
        }
        static void AddtoArrayList(Student[] a, int n)
        {
            ArrayList win = new ArrayList();
            for (int i = 0; i < n; i++)
            {
                win.Add(a[i]);
            }
            Console.WriteLine("Сортировка ArrayList.Sort()\n");
            win.Sort();
            //вывод элементов отсортированного массива - доступ к нему как к коллекции
            foreach (Student i in win)
            {
                Console.Write("{0}  {1}  {2}  {3}  {4}  {5}  {6}  {7}  {8}\n", i.Name, i.Surname, i.FatherName, i.Age, i.Pol, i.Rez1, i.Rez2, i.Rez3, i.gruppa);
            }
            //Сортировка Шелла
        }
        static void Shell(Student[] a, int n)
        {
            int step = n / 2;
            while (step > 0)//пока шаг не 0
            {
                for (int i = 0; i < (n - step); i++)
                {
                    int j = i;
                    //будем идти начиная с i-го элемента
                    while (j >= 0 && a[j].CompareTo(a[j + step]) == 1)
                    //пока не пришли к началу массива
                    //и пока рассматриваемый элемент больше
                    //чем элемент находящийся на расстоянии шага
                    {
                        //меняем их местами
                        Student temp = a[j];
                        a[j] = a[j + step];
                        a[j + step] = temp;
                        j--;
                    }
                }
                step = step / 2;//уменьшаем шаг
            }
            Console.Write("\nСортировка Шелла\n\n");
            Output(a);
        }
        static void LinearSearch(Student[] a, int n)
        {
            Console.WriteLine("\nЛинейный поиск:\nЧто найти?");
            string p = Console.ReadLine();
            for (int i = 0; i < n; i++)
            {
                string fullName = a[i].Name + " " + a[i].Surname + " " + a[i].FatherName;
                if (p == fullName)
                {
                    Console.Write(i);
                }
            }
 
        }
        /*      static void BinarySrch(Student[] a, int n)
              {
                  ArrayList win = new ArrayList();
                  for (int i = 0; i < n; i++)
                  {
                      win.Add(a[i]);
                  }
                  win.Sort();
                  Console.WriteLine("Двоичный поиск:\nчто ищем?");
                  string str = Console.ReadLine();
                  Console.WriteLine(win.BinarySearch(str));
              }*/

        static void Main(string[] args)
        {
            read = new StreamReader("D:\\i.txt");
            int kol = NumberLines();
            Student[] a = new Student[kol];
            read = new StreamReader("D:\\i.txt");
            ReadFile(a);
            AddtoArrayList(a, kol);
            Shell(a, kol);
            LinearSearch(a, kol);
            // BinarySrch(a,kol);
            Console.ReadKey();
        }
    }
}

Решение задачи: «Реализовать бинарный поиск для переопределенного компаратора»

textual
Листинг программы
public class Student : IComparable
    {
        /* Переопределяем стандартный метод CompareTo интерфейса IComparable, 
            нужный для вызова метода Sort */
        public int CompareTo (Object ro)
        {
            Student r = ro as Student;
 
            if (r == null)
                return 1;
 
            int ret = Name.CompareTo (r.Name);
            if (ret != 0)
                return ret;     
 
            ret = Surname.CompareTo (r.Surname);
            if (ret != 0)
                return ret;
 
            ret = FatherName.CompareTo (r.FatherName);
            if (ret != 0)
                return ret;
 
            return gruppa.CompareTo (r.gruppa);
        }
 
        //обьявление членов класса
        public string Name;
        public string Surname;
        public string FatherName;
        public int Age;
        public string Pol;
        public double Rez1;
        public double Rez2;
        public double Rez3;
        public int gruppa;
 
        public override string ToString ()
        {
            return string.Format ("[Student: Name={0}, Surname={1}, FatherName={2}, gruppa={3}]", Name, Surname, FatherName, gruppa);
        }
        
    }
 
 
 
    static void Main (string[] args)
    {
        ArrayList l = new ArrayList ();
        l.Add (new Student () {Name = "Иван", FatherName = "Петрович", Surname = "Козлов", gruppa = 1});
        l.Add (new Student () {Name = "Иван", FatherName = "Иванович", Surname = "Агафонов", gruppa = 1});
 
        l.Sort ();
 
        Console.WriteLine (String.Join ("\n", l.ToArray()));
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5
Похожие ответы