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

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

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

Добрый день, такая проблема: Не могу понять как мне реализовать бинарный поиск для моего переопределенного компаратора. Суть задачи: написать линейный поиск и проверить встроенным бинарным. Вот с бинарным то и проблемы. Коллекция ArrayList.
Листинг программы
  1. using System;
  2. using System.Collections;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO;
  6. using System.Threading.Tasks;
  7. namespace ConsoleApplication1
  8. {
  9. public class Student : IComparable
  10. {
  11. /* Переопределяем стандартный метод CompareTo интерфейса IComparable,
  12. нужный для вызова метода Sort */
  13. public int CompareTo(Object rhs)
  14. {
  15. Student r = (Student)rhs;
  16. Int32 ret = this.Name.CompareTo(r.Name);
  17. if (ret == 0)
  18. {
  19. ret = this.Surname.CompareTo(r.Name);
  20. }
  21. if (ret == 0)
  22. {
  23. ret = this.FatherName.CompareTo(r.FatherName);
  24. }
  25. if (ret == 0)
  26. {
  27. ret = this.gruppa.CompareTo(r.gruppa);
  28. }
  29. return ret;
  30. }
  31. //обьявление членов класса
  32. public string Name;
  33. public string Surname;
  34. public string FatherName;
  35. public int Age;
  36. public string Pol;
  37. public double Rez1;
  38. public double Rez2;
  39. public double Rez3;
  40. public int gruppa;
  41. }
  42. public class Sort
  43. {
  44. static StreamReader read; //поток для чтения
  45. static int NumberLines()
  46. {
  47. int kol = 0;
  48. String line;
  49. while ((line = read.ReadLine()) != null)
  50. {
  51. kol++;
  52. }
  53. read.Close();
  54. return kol;
  55. }
  56. static void ReadFile(Student[] a)
  57. {
  58. char[] delimiters = { ' ' };
  59. string strfromfile = read.ReadLine();
  60. string[] line = new string[9];
  61. int i = 0;
  62. while (strfromfile != null)
  63. {
  64. a[i] = new Student();
  65. line = strfromfile.Split(delimiters);
  66. a[i].Name = line[0];
  67. a[i].Surname = line[1];
  68. a[i].FatherName = line[2];
  69. a[i].Age = Convert.ToInt32(line[3]);
  70. a[i].Pol = line[4];
  71. a[i].Rez1 = Convert.ToDouble(line[5]);
  72. a[i].Rez2 = Convert.ToDouble(line[6]);
  73. a[i].Rez3 = Convert.ToDouble(line[7]);
  74. a[i].gruppa = Convert.ToInt32(line[8]);
  75. i++;
  76. strfromfile = read.ReadLine();
  77. }
  78. read.Close();
  79. }
  80. static void Output(Student[] a)
  81. {
  82. foreach (Student i in a)
  83. {
  84. 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);
  85. }
  86. }
  87. static void AddtoArrayList(Student[] a, int n)
  88. {
  89. ArrayList win = new ArrayList();
  90. for (int i = 0; i < n; i++)
  91. {
  92. win.Add(a[i]);
  93. }
  94. Console.WriteLine("Сортировка ArrayList.Sort()\n");
  95. win.Sort();
  96. //вывод элементов отсортированного массива - доступ к нему как к коллекции
  97. foreach (Student i in win)
  98. {
  99. 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);
  100. }
  101. //Сортировка Шелла
  102. }
  103. static void Shell(Student[] a, int n)
  104. {
  105. int step = n / 2;
  106. while (step > 0)//пока шаг не 0
  107. {
  108. for (int i = 0; i < (n - step); i++)
  109. {
  110. int j = i;
  111. //будем идти начиная с i-го элемента
  112. while (j >= 0 && a[j].CompareTo(a[j + step]) == 1)
  113. //пока не пришли к началу массива
  114. //и пока рассматриваемый элемент больше
  115. //чем элемент находящийся на расстоянии шага
  116. {
  117. //меняем их местами
  118. Student temp = a[j];
  119. a[j] = a[j + step];
  120. a[j + step] = temp;
  121. j--;
  122. }
  123. }
  124. step = step / 2;//уменьшаем шаг
  125. }
  126. Console.Write("\nСортировка Шелла\n\n");
  127. Output(a);
  128. }
  129. static void LinearSearch(Student[] a, int n)
  130. {
  131. Console.WriteLine("\nЛинейный поиск:\nЧто найти?");
  132. string p = Console.ReadLine();
  133. for (int i = 0; i < n; i++)
  134. {
  135. string fullName = a[i].Name + " " + a[i].Surname + " " + a[i].FatherName;
  136. if (p == fullName)
  137. {
  138. Console.Write(i);
  139. }
  140. }
  141. }
  142. /* static void BinarySrch(Student[] a, int n)
  143. {
  144. ArrayList win = new ArrayList();
  145. for (int i = 0; i < n; i++)
  146. {
  147. win.Add(a[i]);
  148. }
  149. win.Sort();
  150. Console.WriteLine("Двоичный поиск:\nчто ищем?");
  151. string str = Console.ReadLine();
  152. Console.WriteLine(win.BinarySearch(str));
  153. }*/
  154.  
  155. static void Main(string[] args)
  156. {
  157. read = new StreamReader("D:\\i.txt");
  158. int kol = NumberLines();
  159. Student[] a = new Student[kol];
  160. read = new StreamReader("D:\\i.txt");
  161. ReadFile(a);
  162. AddtoArrayList(a, kol);
  163. Shell(a, kol);
  164. LinearSearch(a, kol);
  165. // BinarySrch(a,kol);
  166. Console.ReadKey();
  167. }
  168. }
  169. }

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

textual
Листинг программы
  1. public class Student : IComparable
  2.     {
  3.         /* Переопределяем стандартный метод CompareTo интерфейса IComparable,
  4.             нужный для вызова метода Sort */
  5.         public int CompareTo (Object ro)
  6.         {
  7.             Student r = ro as Student;
  8.  
  9.             if (r == null)
  10.                 return 1;
  11.  
  12.             int ret = Name.CompareTo (r.Name);
  13.             if (ret != 0)
  14.                 return ret;    
  15.  
  16.             ret = Surname.CompareTo (r.Surname);
  17.             if (ret != 0)
  18.                 return ret;
  19.  
  20.             ret = FatherName.CompareTo (r.FatherName);
  21.             if (ret != 0)
  22.                 return ret;
  23.  
  24.             return gruppa.CompareTo (r.gruppa);
  25.         }
  26.  
  27.         //обьявление членов класса
  28.         public string Name;
  29.         public string Surname;
  30.         public string FatherName;
  31.         public int Age;
  32.         public string Pol;
  33.         public double Rez1;
  34.         public double Rez2;
  35.         public double Rez3;
  36.         public int gruppa;
  37.  
  38.         public override string ToString ()
  39.         {
  40.             return string.Format ("[Student: Name={0}, Surname={1}, FatherName={2}, gruppa={3}]", Name, Surname, FatherName, gruppa);
  41.         }
  42.        
  43.     }
  44.  
  45.  
  46.  
  47.     static void Main (string[] args)
  48.     {
  49.         ArrayList l = new ArrayList ();
  50.         l.Add (new Student () {Name = "Иван", FatherName = "Петрович", Surname = "Козлов", gruppa = 1});
  51.         l.Add (new Student () {Name = "Иван", FatherName = "Иванович", Surname = "Агафонов", gruppa = 1});
  52.  
  53.         l.Sort ();
  54.  
  55.         Console.WriteLine (String.Join ("\n", l.ToArray()));
  56.     }

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


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

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

8   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы