Линейный и двоичный поиск в списке - C#
Формулировка задачи:
Здравствуйте!! Дан список, содержащий 10 записей, каждая из которых имеет структуру:
Шифр товара (тип строка,5 символов)|Наименование товара(тип строка, 20 символов) | Цена(руб.) (число типа real) |Признак наличия или отсутствия
(К примеру,
KW462,Эл.чайник "KENWOOD" ,3000,Отсутствует
MO463,Блендер "Moolinex" ,5000,В наличии
BR095,Соковыжималка "BORK",9000,Отсутствует
PH453,DVD-плеер "Philips" ,10000,Отсутствует
BB346,Смартфон"BlackBerry",21500,Отсутствует
PH674,Телевизор "Philips" ,24000,Отсутствует
SM434,Телевизор "SAMSUNG" ,26000,В наличии
SH564,Холодильник "SHARP" ,29000,В наличии
H4844,Принтер+сканер"HP" ,30000,В наличии
SM567,Ультрабук "SAMSUNG" ,35500,Отсутствует)
Список упорядочен по возрастанию цены.Разработать алгоритмы и программы линейного и двоичного поиска всех товаров имеющих цену, не меньше 25000 руб. с выводом найденных записей на экран.
Помогите,пожалуйста! Заранее большое спасибо!
Решение задачи: «Линейный и двоичный поиск в списке»
textual
Листинг программы
using System;
using System.Net;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication26
{
class Product : IComparable<Product>
{
private string code;
private string name;
public decimal price { get; set; }
public bool isHave { get; set; }
public Product(string _code, string _name, decimal _price, bool _isHave)
{
Code = _code;
Name = _name;
price = _price;
isHave = _isHave;
}
public string Code
{
get { return code; }
set
{
if (value.Length <= 5) code = value;
else code = null;
}
}
public string Name
{
get { return name; }
set
{
if (value.Length <= 20) name = value;
else name = null;
}
}
public int CompareTo(Product prod)
{
if (prod == null) return 1;
if (this.price > prod.price) return 1;
else if (this.price < prod.price) return -1;
return 0;
}
public override string ToString()
{
return string.Format("Шифр товара: {0},Наименование товара: {1},Цена: {2},Наличие: {3}", this.Code, this.Name, this.price, this.isHave == true ? "Да" : "Нет");
}
}
static class Search
{
public static List<Product> LinearSearch(List<Product> lst, int tempPrice)
{
List<Product> temp = new List<Product>();
foreach (Product i in lst)
{
if (i.price >= tempPrice)
{
temp.Add(i);
Console.WriteLine(i.ToString());
}
}
return temp;
}
public static List<Product> BinarySearch(List<Product> lst, int tempPrice)
{
int productIndex = 0;
List<Product> temp = new List<Product>();
temp.AddRange(lst);
List<Product> outList = new List<Product>();
if (tempPrice <= temp[temp.Count - 1].price)
{
while (true)
{
if (temp.Count != 1)
{
if (temp[temp.Count / 2].price > tempPrice)
{
temp.RemoveRange(temp.Count / 2, temp.Count / 2);
}
else if (temp[temp.Count / 2].price < tempPrice)
{
productIndex += temp.Count / 2;
temp.RemoveRange(0, temp.Count / 2);
}
else
{
productIndex += temp.Count / 2;
break;
}
}
else
{
productIndex += temp.Count / 2 + 1;
break;
}
}
}
if (productIndex != 0)
{
for (int i = productIndex; i < lst.Count; i++)
{
outList.Add(lst[i]);
Console.WriteLine(lst[i].ToString());
}
}
return outList;
}
}
class Program
{
static void Main()
{
List<Product> lst = new List<Product>() {
new Product("H4844", "Принтер+сканер\"HP\"", 30000, true),
new Product("SM567", "Ультрабук\"SAMSUNG\"", 35500, false),
new Product("KW462", "Эл.чайник\"KENWOOD\"", 3000, false),
new Product("MO463", "Блендер\"Moolinex\"", 5000, true),
new Product("BR095", "Соковыжималка\"BORK\"", 9000, false),
new Product("PH453", "DVD-плеер\"Philips\"", 10000, false),
new Product("BB346", "Смартфон\"BlackBerry\"", 21500, false),
new Product("PH674", "Телевизор\"Philips\"", 24000, false),
new Product("SM434", "Телевизор\"SAMSUNG\"", 26000, true),
new Product("SH564", "Холодильник\"SHARP\"", 29000, true),
};
lst.Sort();
List<Product> binaryResult = Search.BinarySearch(lst, 35500);
Console.WriteLine("--------------------------------------------------------------------------------");
List<Product> linearResult = Search.LinearSearch(lst, 25000);
}
}
}