Ошибка сортировки выбора: неправильный вывод; Дубликаты не отсортированы - PullRequest
0 голосов
/ 18 апреля 2019

Мой алгоритм сортировки дает неверные результаты.Я попытался определить ошибку, но я не уверен, почему сортировка выбора не работает.Где я могу исправить ошибку в выводе?Мой вывод 1 4 5 6 7 3 7 9 10 Поэтому 3 между 7 не сортируются ..

static void Main(string[] args)
    {
        int[] Array = { 1, 7, 6, 5, 4, 3, 7, 9, 10 };
        Console.WriteLine("Array before sorting: ");
        for (int i = 0; i <= Array.Length-1 ; i++)
        {
            Console.WriteLine(Array[i] + " " );

        }

        SelectionSort(Array);
        Console.ReadLine();
    }

    public static void SelectionSort(int[] Array) // ascending order
    {
        int min;
        for (int i = 0; i <= Array.Length-1 ; i++) // go through the list
        {
            min = i; // minimum equals the current position in list
            for (int j = i+1; j < Array.Length; j++)
            {
                if (Array[j] < Array[min])
                    min = j; // min equals smallest in list j
                swap(Array, i, min); // swap current position in list i and the smallest position in list j
            }
        }
        Console.WriteLine("Array after selection sort: "); 
        for (int i = 0; i < Array.Length; i++) // display the sorted list
        {
            Console.WriteLine(Array[i] + " ");
        }
    }

    public static void swap(int[] Array,int x, int y)
    {
        int temp = Array[x];
        Array[x] = Array[y];
        Array[y] = temp;
    }

}}

1 Ответ

2 голосов
/ 18 апреля 2019
static void Main(string[] args)
{
    int[] Array = { 1, 7, 6, 5, 4, 3, 7, 9, 10 };
    Console.WriteLine("Array before sorting: ");
    for (int i = 0; i <= Array.Length-1 ; i++)
    {
        Console.WriteLine(Array[i] + " " );

    }

    SelectionSort(Array);
    Console.ReadLine();
}

public static void SelectionSort(int[] Array) // ascending order
{
    int min;
    for (int i = 0; i <= Array.Length-1 ; i++) // go through the list
    {
        min = i; // minimum equals the current position in list
        for (int j = i+1; j < Array.Length; j++)
        {
            if (Array[j] < Array[min])
                min = j; // min equals smallest in list j
        }
        swap(Array, i, min); // swap current position in list i and the smallest position in list j
    }
    Console.WriteLine("Array after selection sort: "); 
    for (int i = 0; i < Array.Length; i++) // display the sorted list
    {
        Console.WriteLine(Array[i] + " ");
    }
}

public static void swap(int[] Array,int x, int y)
{
    int temp = Array[x];
    Array[x] = Array[y];
    Array[y] = temp;
}

своп должен быть вне цикла for. Сначала вы хотите найти наименьшее число, а затем обменять его на текущий элемент. В вашем коде он менялся каждый раз, когда получал меньшее число.

...