作业:排序算法



我应该创建一个根据以下步骤进行排序的算法:

方法 1

选择列表中的最小数字,然后与第一个数字交换。

选择列表中最小的数字,然后与第二个数字交换。 从第二个数字开始检查。

选择列表中最小的数字,然后与第三个数字交换。 从第三个数字开始检查。

选择列表中最小的数字,然后与第四个数字交换。 从第四个数字开始检查。

重复。。。直到你到达最后一个数字。

目前,这是我想出的代码:

public static void method1() {
int low = 999;        
int index = 0;
int safe;
int[] num = new int[] { 33, 22, 8, 59, 14, 47, 60, 27 };
for(int i = 0; i < num.length; i++) {
if(low > num[i]) {
low = num[i];
index = i;
}
}
for (int i = 0; i < num.length; i++) {
safe = num[i];
num[i] = num[index];
low = 999;
for(int j = (i+1); j < num.length; j++) {
if(low > num[j]) {
low = num[j];
}
}
}
for (int i = 0; i < num.length; i++) {
System.out.print(num[i] +", ");
}
}

输出如下所示:

run:
8, 8, 8, 8, 8, 8, 8, 8, 
BUILD SUCCESSFUL (total time: 0 seconds)

为什么我在输出中只得到 8 的值?由于这是家庭作业,请不要告诉我答案。我只想得到指导,谢谢!

编辑:

代码现在如下所示:

int low = 999;        
int index = 0;
int safe;
int[] num = new int[] { 33, 22, 8, 59, 14, 47, 60, 27 };
for(int i = 0; i < num.length; i++) {
if(low > num[i]){
low = num[i];
index = i;
}
}
for (int i = 0; i < num.length; i++) {
safe = num[i];
num[i] = num[index];
low = 999;
for(int j = (i+1); j < num.length; j++) {
if(low > num[j]){
low = num[j];
index = j;
}
}
}
for (int i = 0; i < num.length; i++) {
System.out.print(num[i] +", ");
}
System.out.println("");

这给了我一个输出:

run:
8, 8, 8, 14, 14, 27, 27, 27, 
BUILD SUCCESSFUL (total time: 0 seconds)

这个家庭作业的日期已经过去,但我想我会添加一些循序渐进的方法。

我处理这个问题的方法是将其分解为小步骤。每个步骤都应该是一个方法或函数。


1. 第一步是找到数组中的最小数字,从 N 开始。

因此,这样做的方法是:

private int findLowestStartingAtNth( int n ) {
int lowest = Integer.MAX_VALUE;
for( int i = n ; i < numbers.length ; i++ ) {
if( numbers[i] < lowest ) {
lowest = numbers[i]; 
}
}
return lowest;
}

2.然后我们需要交换数组中的两个任意数字。

这很简单:

private void swapNumbers( int i, int j ) {
int temp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = temp;
}

3. 但是如果我们希望findLowestStartingAtNth()的输出馈送到swapNumbers()的输入中,那么我们需要返回索引而不是数字本身。

因此,步骤 1. 中的方法更改为:

private int findLowestStartingAtNth( int n ) {
int lowest = Integer.MAX_VALUE;
int index = n;
for( int i = n ; i < numbers.length ; i++ ) {
if( numbers[i] < lowest ) {
lowest = numbers[i]; 
index = i;
}
}
return index;
}

4. 让我们使用我们必须实现的第一步

选择列表中的最小数字,然后与第一个数字交换。

第一个数字是数组中的第 0 个。

int numbers = new int[] {33, 22, 8, 59, 14, 47, 60, 27};
int found = findLowestStartingAtNth( 0 );
swapNumbers(0, found);

5.我们有一个模式。从第一个开始检查,与第一个交换。从第二个开始检查,与第二个交换。开始用X检查,用X交换。

因此,让我们用另一种方法包装此模式:

private int[] numbers = new int[] {33, 22, 8, 59, 14, 47, 60, 27};
private void sort() {
for( int i = 0 ; i < numbers.length ; i++ ) {
int j = findLowestStartingAtNth( i );
swapNumbers(i, j);
}
}

6. 最后,将其包装在一个类中,并从main()方法触发它。看看代码有多清晰,因为它被分解成小步骤。

整个结果类将是:

public class Method1 {
public static void main(String[] args) {
Method1 m = new Method1();
m.numbers = new int[] {33, 22, 8, 59, 14, 47, 60, 27};
m.sort();
System.out.println(Arrays.toString(m.numbers));
}
private int[] numbers;
private int findLowestStartingAtNth( int n ) {
int lowest = Integer.MAX_VALUE;
int index = n;
for( int i = n ; i < numbers.length ; i++ ) {
if( numbers[i] < lowest ) {
lowest = numbers[i]; 
index = i;
}
}
return index;
}
private void swapNumbers( int i, int j ) {
int temp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = temp;
}
private void sort() {
for( int i = 0 ; i < numbers.length ; i++ ) {
int j = findLowestStartingAtNth( i );
swapNumbers(i, j);
}
}
}

最新更新