Я пытаюсь создать метод selectionSort для упорядочивания значений в порядке убывания. Этот код размещает их в порядке возрастания. Как я могу поменять местами этот код, чтобы расположить его по-другому.
public void selectionSort()
{
int n = data.length;
for(int index = 0; index < n-1; index++)
{
int min_idx = index;
for(int j = index+1; j < n; j++)
if (data[j] < data[min_idx])
min_idx = j;
int temp = data[min_idx];
data[min_idx] = data[index];
data[index] = temp;
}
}




На данный момент я могу думать о двух методах. Я их не пробовал, но попробовать стоит.
Умножьте все числа на -1 и примените исходную сортировку выбора для сортировки по возрастанию. После завершения сортировки умножьте все числа на -1, чтобы получить исходные числа, но теперь они отсортированы в порядке убывания.
Попробуйте изменить условие сравнения
если (данные [j] <данные [min_idx])
к
если (данные [j]> = данные [min_idx])
Сообщите мне, если с этими методами возникнут проблемы.
Второй способ отлично сработал! Спасибо за помощь!
Добро пожаловать, @ Christian. Я рада, что он вам помог. Не могли бы вы отметить этот ответ как принятый?
Вместо того, чтобы выбирать минимальный элемент на каждой итерации, вы должны выбрать максимальный. Все, что вам действительно нужно сделать, это изменить условие < на >, но я также соответствующим образом изменил имена, чтобы упростить понимание кода:
public void selectionSort()
{
int n = data.length;
for(int index = 0; index < n-1; index++)
{
int max_idx = index; // max_idx instead of min_idx
for(int j = index+1; j < n; j++)
if (data[j] > data[min_idx]) // > instead of <
max_idx = j;
int temp = data[max_idx];
data[max_idx] = data[index];
data[index] = temp;
}
}
Чтобы решить эту проблему, я бы порекомендовал вам сначала провести рефакторинг вашего кода. Переместите swap и findMin в отдельный метод:
private static int getMin(int[] arr, int from, int to) {
int min = from;
for (int j = from; j < to; j++)
min = arr[j] < arr[min] ? j : min;
return min;
}
private static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
Здесь вы, наверное, видите, что реализация сортировки ASC и DESC тривиальна:
public static void selectionSortAsc(int[] arr) {
for (int i = 0; i < arr.length - 1; i++)
swap(arr, getMin(arr, i + 1, arr.length), i);
}
public static void selectionSortDesc(int[] arr) {
for (int i = arr.length - 1; i > 0; i--)
swap(arr, getMin(arr, 0, i + 1), i);
}
public static class SelectionSort
{
static int min;
public static void Sort(int[] data)
{
for (int i = 0; i < data.Length; i++)
{
for (int j = 0; j < data.Length; j++)
{
min = j;
if (data[i] < data[j])
Swap(x: ref data[i], y: ref data[min]);
}
}
}
private static void Swap(ref int x, ref int y)
{
int temp = x;
x = y;
y = temp;
}
}
For Ascending this line
if (data[i] < data[j])
For Descending this line
if (data[i] > data[j])
Возможный дубликат Обратный порядок массива