如何反转SelectionSort以降序显示?
How to reverse SelectionSort to display in descending order?
我正在尝试创建一个 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])
如果这些方法有问题,请告诉我。
不是 select 每次迭代中的最小项目,而是 select 最大项目。您真正需要做的就是将 <
条件更改为 >
,但我还相应地更改了名称以使代码更易于理解:
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])
我正在尝试创建一个 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])
如果这些方法有问题,请告诉我。
不是 select 每次迭代中的最小项目,而是 select 最大项目。您真正需要做的就是将 <
条件更改为 >
,但我还相应地更改了名称以使代码更易于理解:
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])