Шейкерная сортировка для списка

Вывести фамилии учеников в порядке возрастания их роста, используя метод шейкер – сортировки

Создал класс Student для описания (возможно ли сделать это с помощь двумерного массива?)

Есть код для массива. Не могу применить алгоритм к списку и вывести фамилии. Помогите, пожалуйста, с задачей.

namespace Appp1
{
    class Program
    {
        class Student
        {
            public string name;
            public double sheight;
 
            public Student(string name, double sHeight)
            {
                this.name = name;
                this.sheight = sHeight;
            }
        }
        static void Main(string[] args)
        {
 
            List<Student> listS = new List<Student>();
            //Добавление учеников
            listS.Add(new Student("Ivanov", 165.1));
            listS.Add(new Student("Petrov", 145.1));
            listS.Add(new Student("Sidorov", 150.3));
 
            // Шейк-сортировка
            static void ShakerSort(int[] listS)
            {
                int left = 0,
                    right = listS.Length - 1,
                    count = 0;
 
                while (left < right)
                {
                    for (int i = left; i < right; i++)
                    {
                        count++;
                        if (listS[i] > listS[i + 1])
                            Swap(listS, i, i + 1);
                    }
                    right--;
 
                    for (int i = right; i > left; i--)
                    {
                        count++;
                        if (listS[i - 1] > listS[i])
                            Swap(listS, i - 1, i);
                    }
                    left++;
                }
                static void Swap(int[] listS, int i, int j)
                {
                    int glass = listSt[i];
                    listS[i] = listSt[j];
                    listS[j] = glass;
                }
                static void WriteArray(int[] a)
                {
                    foreach (int i in a)
                        Console.Write("{0}|", i.ToString());
                    Console.WriteLine("\n\n\n");
                }
            }
        }
    }
}

Ответы (1 шт):

Автор решения: aepot

Почему у вас класс Student внутри класса Program? Не используйте вложенные классы, это плохая практика, за редкими исключениями.

Почему метод ShakerSort внутри метода Main? Не используйте вложенные методы, это плохая практика, за редкими исключениями. Swap и WriteArray - то же самое. Не лепите матрёшки там где без них можно обойтись, с ними сложнее работать.

В остальном, достаточно было заменить типы и обращаться к нужному полю при сортировке. Ну переименовал вам немного переменные, уделяйте внимание читаемости кода.

class Student
{
    public string name;
    public double height;

    public Student(string name, double height)
    {
        this.name = name;
        this.height = height;
    }
}

class Program
{
    static void Main(string[] args)
    {
        List<Student> students = new List<Student>();

        students.Add(new Student("Ivanov", 165.1));
        students.Add(new Student("Petrov", 145.1));
        students.Add(new Student("Sidorov", 150.3));

        StudentShakerSort(students);

        foreach (Student student in students)
        {
            Console.WriteLine($"{student.name} {student.height}");
        }
    }

    static void StudentShakerSort(List<Student> list)
    {
        int left = 0,
            right = list.Count - 1,
            count = 0;

        while (left < right)
        {
            for (int i = left; i < right; i++)
            {
                count++;
                if (list[i].height > list[i + 1].height)
                    Swap(list, i, i + 1);
            }
            right--;

            for (int i = right; i > left; i--)
            {
                count++;
                if (list[i - 1].height > list[i].height)
                    Swap(list, i - 1, i);
            }
            left++;
        }

    }

    static void Swap(List<Student> list, int i, int j)
    {
        Student x = list[i];
        list[i] = list[j];
        list[j] = x;
    }
}

Вывод в консоль

Petrov 145,1
Sidorov 150,3
Ivanov 165,1

возможно ли сделать это с помощью двумерного массива?

Возможно всё, но зачем?

→ Ссылка