Как мне исправить неявные ошибки преобразования в моем алгоритме быстрой сортировки c #?

#c# #quicksort #implicit-conversion

#c# #быстрая сортировка #неявное преобразование

Вопрос:

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

Не удается неявно преобразовать тип ‘float’ в ‘int’. Существует явное преобразование (вам не хватает приведения)?

Вот алгоритм:

 class Quicksort
{
    public static void Sort(float[] numbers, int left, int right)
    {
        float i = Convert.ToSingle(left);
        float j = Convert.ToSingle(right);

        var pivot = numbers[(left   right) / 2];

        while (i <= j)
        {
            while (numbers[i] < pivot) //ERROR HERE
                i  ;

            while (numbers[j] > pivot) //ERROR HERE
                j--;

            if (i <= j)
            {
                float tmp = numbers[i]; //ERROR HERE
                numbers[i] = numbers[j]; //ERROR HERE
                numbers[j] = tmp; //ERROR HERE

                i  ;
                j--;
            }
        }

        if (left < j)
            Sort(numbers, left, j);

        if (i < right)
            Sort(numbers, i, right);
    }
}
  

Ошибка преобразования появляется всякий раз, когда я использую numbers[i] или numbers[j]

Как бы мне это исправить?

Спасибо

Комментарии:

1. Почему вы преобразуете целые числа в числа с плавающей запятой? i и j могут быть просто целыми числами.

Ответ №1:

Проблема в том, что вы пытаетесь использовать значения с плавающей запятой для индексов массива. Это не работает: индексы массива всегда являются целыми числами в C #, независимо от типа элемента массива. Это имеет смысл — например, нет такого понятия, как «элемент 1.3 массива».

Просто измените первые две строки вашего метода на:

 int i = left;
int j = right;
  

… или i j полностью удалить и и использовать left и right во всем методе.

Комментарии:

1. Разве i и j не должны быть int ?

Ответ №2:

Проблема в том, что i и j являются индексаторами и должны определяться как тип int .

 int i = left;
int j = right;