如何在Java中实现降序选择排序?

时间:2018-09-17 18:29:31

标签: java sorting selection-sort

我想实现一个选择排序方法,该方法采用一个整数数组并按降序对其进行排序。但是,诀窍是保持原始选择排序方法不变,而是使用简单的算术运算,并且在数组完成排序后不添加额外的循环来交换元素。这是我的代码,其想法是将最大值和最小值的位置存储在局部变量中,并在内循环完成迭代后将它们与相应的位置交换。我什至尝试使用仅一个变量来找到最小值,并将其放在数组的末尾,但是我失败了,我得到了错误的结果,我需要帮助发现错误。这是我的代码

public static void newSortMethod(int[]a){
    for(int i = 0; i < a.length-1; i++){
        int maxPosition=i;
        int minPosition=i;
        for(int j = i+1; j < a.length; j++){
            if(a[j] < a[minPosition]){
                minPosition = j;
            }
            if(a[j] > a[maxPosition]){
                maxPosition = j;
            }
        }
        swap(a,maxPosition,i);
        swap(a,minPosition,a.length-i-1);
    }
    System.out.println();
}

public static void swap(int[]a, int i, int j){
    int temp = a[i];
    a[i] = a[j];
    a[j] = temp;
}

public static void main(String[] args) {
    int[] a = {2,6,3,9,5,4,8,7,0,13,-3,1};
    newSortMethod(a);
}

这是到目前为止的程序输出 -3 8 2 9 13 5 4 6 3 1 7 0

2 个答案:

答案 0 :(得分:2)

您的原始算法有误。首先,if块应该与minPositionmaxPosition而不是i进行比较。其次,如果您同时选择了最小值最大值,那么您的内部for循环应该停在a.length - i而不是a.length处(因为顶部的i元素也是排序)。两者都可以为您提供升序算法。

public static void newSortMethod(int[]a){
    for(int i = 0; i < a.length; i++){
        int maxPosition=i;
        int minPosition=i;
        for(int j = i+1; j < a.length - i; j++){
            if(a[j] < a[minPosition]){
                minPosition = j;
            }
            if(a[j] > a[maxPosition]){
                maxPosition = j;
            }
        }
        swap(a,maxPosition,i);
        swap(a,minPosition,a.length-i-1);
    }
}

要切换到降序,只需添加一行。

public static void newSortMethod(int[]a){
    for(int i = 0; i < a.length; i++){
        int maxPosition=i;
        int minPosition=i;
        for(int j = i+1; j < a.length - i; j++){
            if(a[j] < a[minPosition]){
                minPosition = j;
            }
            if(a[j] > a[maxPosition]){
                maxPosition = j;
            }
        }
        swap(a,minPosition,maxPosition); // <-- this line
        swap(a,maxPosition,i);
        swap(a,minPosition,a.length-i-1);
    }
}

答案 1 :(得分:1)

错误

首先,让我们查找代码中的问题。有一些,在编程中经常发生。

  • 您的代码仍在尝试以b升序排序,然后尝试将最大值放在最后,而这并不是您想要的:您想将最大值放在开始。 li>
  • 您的 Dim COMMAND As MySqlCommand Dim reader As MySqlDataReader Dim conn As MySqlConnection Dim Item1 As String = "INSERT INTO item_template (entry, name, display) VALUES ('1234', 'Testing', '654';" Dim Item3 As String = "UPDATE Item_template SET entry = '123' where name like 'test32111';" Dim Item2 As String = "INSERT INTO item_template (entry, name, display) VALUES ('123467', 'Testing332', '65478';" Try conn.Open() COMMAND = New MySqlCommand(Item1, conn) reader = COMMAND.ExecuteReader conn.Close() Catch ex As Exception MessageBox.Show(ex.Message) End Try Try conn.Open() COMMAND = New MySqlCommand(Item3, conn) reader = COMMAND.ExecuteReader conn.Close() Catch ex As Exception MessageBox.Show(ex.Message) End Try Try conn.Open() COMMAND = New MySqlCommand(Item2, conn) reader = COMMAND.ExecuteReader conn.Close() Catch ex As Exception MessageBox.Show(ex.Message) End Try 从未修改过,因此您将继续打印swap(a,minPosition,i)

样品溶液

现在让我们看看有什么用。我不确定您选择的升序排序是什么样的,但我想应该是这样的:

n

要使其按降序排序,只需切换比较运算符(为清楚起见,还可以切换0标识符)。

public static void ascendingSortMethod(int[]a){
    int n = 0; // this is only to count how many times the swap method was called
    for(int i = 0; i < a.length-1; i++){
        int minPosition = i;
        for(int j = i+1; j < a.length; j++){
            if(a[j] < a[minPosition]){
                minPosition = j;
            }
        }
        if(minPosition != i){ // check whether swap is necessary
            swap(a,minPosition,i);
            n ++;
        }
    }
    System.out.println(n);
}