#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;