Выбор Сортировка проблем с индексами

На самом деле я имею дело с проблемой CodeAbbey, поэтому я не хочу отвечать как код, а объяснить, что я делаю неправильно.http://www.codeabbey.com/index/task_view/selection-sort

Моя сортировка выбора фактически работает без каких-либо проблем, но я не знаю, почему я не получаю правильные индексы (когда сортировка работает!). То есть для входных данных:5 1 3 6 2 4 7 9 8 0 Я получил это отсортировано по0 1 2 3 4 5 6 7 8 9, как я и хотел.

Вот код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SelectionSort
{
    class Program
    {
        static void Main(string[] args)
        {
        int howMany = int.Parse(Console.ReadLine()); //length of array
        List<int> Base = new List<int>(Array.ConvertAll(Console.ReadLine().Split(), int.Parse)); //input to array (i.e. 5 1 3 6 2 4 7 9 8 0 => { 5, 1, 3, 6, 2, 4, 7, 9, 8, 0 })
        List<int> Output = new List<int>(); // list to store sorted array

        string[] ans = new string[howMany];   // array for storing answers

        int loops = Base.Count();

        for(int i = 0; i != loops; i++)
        {
            int topID = 0, topValue = 0;
            for(int j = 0; j != Base.Count(); j++)
            {
                if (j == 0)
                {
                    topID = 0;
                    topValue = Base[0];
                }
                else
                {
                    if(topValue < Base[j])
                    {
                        topValue = Base[j];
                        topID = j;   
                    }
                }
            }
            ans[i] = topID.ToString();  //after looping through array save topID to answer array
            Output.Add(Base[topID]);    //add topValue to output
            Base.RemoveAt(topID);       //remove topValue with index topID from list
        }

        //Output.Reverse();                 // Writing on stdout
        //foreach(var s in Output)          // sorted array
        //{                                 //
        //    Console.Write(s + " ");       // It works without any problems
        //}                                 //
        //Console.ReadLine();               //

        foreach(var s in ans)
        {
            Console.Write(s + " ");    // write on stdout stored indexes
        }
        Console.ReadLine();
    }

  }
}

То есть для таких тестовых данных:

124 144 146 4 121 106 142 153 168 122 42 135 127 126 16 193 52 29 161 186 83 152 72 51 125 37 116 187 133 183 132 80 53 185 129 7 189 98 128 32 33 56 157 49 50 10 77 11 196 160 162 68 43 14 181 112 113 94 100 165 79 172 159 156 57 9 6 66 86 17 63 46 178 130 88 192 124 105 182 34 18 76 155 24 89 123 12 179 109 188 13 40 5 163 45 27 85 103 93 69 58 25 81 145 92 30 138 154 177 158 140 91 171 139 67 175 184 120 8 54 147 84 174 95 55

Я получил это отсортировано по:4 5 6 7 8 9 10 11 12 13 14 16 17 18 24 25 27 29 30 32 33 34 37 40 42 43 45 46 49 50 51 52 53 54 55 56 57 58 63 66 67 68 69 72 76 77 79 80 81 83 84 85 86 88 89 91 92 93 94 95 98 100 103 105 106 109 112 113 116 120 121 122 123 124 125 126 127 128 129 130 132 133 135 138 139 140 142 144 145 146 147 152 153 154 155 156 157 158 159 160 161 162 163 165 168 171 172 174 175 177 178 179 181 182 183 184 185 186 187 188 189 192 193 196

и я получил такие показатели:47 14 72 34 84 25 17 29 107 25 69 46 76 63 94 100 105 52 96 7 49 76 41 15 39 47 86 33 46 61 82 6 15 87 1 75 0 3 76 77 75 5 16 16 46 18 20 5 5 11 42 48 3 1 64 10 26 25 44 1 36 48 25 12 58 23 45 49 50 37 32 28 41 49 5 43 8 21 16 29 5 35 16 37 21 22 32 18 11 34 33 7 3 4 9 8 15 22 10 1 18 3 12 5 4 17 2 14 14 10 9 8 1 4 7 6 3 2 2 4 1 1 1 0

когда я должен был получить это:47 14 74 35 88 26 18 32 115 28 77 53 86 71 107 28 74 60 86 7 58 92 49 17 48 61 28 41 62 81 60 6 20 88 1 6 0 5 74 53 5 10 27 29 72 33 37 11 12 23 12 53 8 3 32 25 55 54 0 4 11 41 57 36 14 56 28 56 8 5 12 8 41 35 19 19 30 14 45 29 21 28 35 37 5 32 19 11 19 30 26 31 15 22 21 28 3 11 19 9 6 9 11 5 15 7 16 3 3 10 12 3 3 8 1 6 6 3 4 3 1 0 1

Что я делаю неправильно? Привет

 usr11 июн. 2016 г., 14:41
Почему есть дубликаты индексов? Это не должно быть возможно.... 1 0 1 совершенно неправильно. Ты не согласен?
 usr11 июн. 2016 г., 14:20
Можете ли вы воспроизвести проблему с очень коротким массивом, например, длина 3?
 Gabriel Chomiczewski11 июн. 2016 г., 14:33
На самом деле это работает без проблем с такими короткими массивами
 usr11 июн. 2016 г., 14:35
Откуда вы знаете, что индексы на самом деле неверны? Они могут быть правильными, а ваше предполагаемое решение может быть неправильным.
 Gabriel Chomiczewski11 июн. 2016 г., 14:45
Дубликаты возможны, потому что мы удаляем самые большие значения (т.е. если у нас есть2 3 1 тогда это вывод должен быть1 0 0, но последний индекс должен быть 0, я немного подумаю об этом. Спасибо!
 Gabriel Chomiczewski11 июн. 2016 г., 14:36
Когда я помещаю свой результат в «тестер», он дает мне результат: «Неправильный ответ: Ожидаемый был:» и перечисленные индексы.
 Gabriel Chomiczewski11 июн. 2016 г., 14:38
И некоторые из них хороши, но некоторые из них просто не очень (сравните индексы, которые я получил и индексы, которые я должен был получить)
 usr11 июн. 2016 г., 14:34
Я сомневаюсь, что. Ошибка, конечно, не требует массива из 100 элементов. В коде нет ничего, что могло бы инициировать новый путь к коду только с очень длинными массивами. Я предлагаю вам протестировать код со всеми возможными перестановками1,2,3,4, Багбудут быть найденным таким образом, я ставлю на это деньги.
 usr11 июн. 2016 г., 14:47
У вас уже есть способ найти ошибку: протестируйте код со всеми возможными перестановками 1,2,3,4. Поймите, что вы можете решить эту проблему самостоятельно. Если вы хотите научиться хорошо программировать, вам нужно разработать инструменты для самостоятельного решения проблем.
 usr11 июн. 2016 г., 14:19
Ваш код может получить выгоду от Code Review SE после исправления ошибки. Существует множество стилистических проблем, которые вы, возможно, захотите понять и избежать в будущем.

Ответы на вопрос(1)

Решение Вопроса

Вкратце, вы не следуете ожидаемому алгоритму, отсюда и разница.

Ожидается, чтообмен найденный элемент max на каждом шаге с текущим последним элементом, и вы реализовали его по-разному,удаление найденный максимальный элемент. Хотя это дает правильно отсортированный вывод, индексы отличаются (RemoveAt перемещает все индексы после удаления).

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

Или исправьте вышеуказанные реализации следующим образом:

замещать

for(int j = 0; j != Base.Count(); j++)

с

int lastID = Base.Count - 1 - i;
for (int j = 0; j <= lastID; j++)

затем заменить

Base.RemoveAt(topID);

с

Base[topID] = Base[lastID];
Base[lastID] = topValue;

и вы сделали.

Также обратите внимание, что этона месте алгоритм, и в концеBase список будет содержать отсортированный результат, поэтомуOutput список излишний.

Ваш ответ на вопрос