以下是我对Selection Sort的实现:
package algorithm.selectionsort;
public class SelectionSort {
public static void main(String[] args) {
int[] myArray = selectionSort(new int[] { 9, 9, 9, 8, 7, 73, 32, 109, 1100, 432, 321, 0 });
for (int element : myArray) {
System.out.print("" + element + " ");
}
}
public static int[] selectionSort(int[] a) {
int min;
for (int i = 0; i < a.length - 1; i++) {
min = i;
for (int j = i + 1; j < a.length; j++) {
if (a[j] < a[min]) {
min = j;
int temp = a[i];
a[i] = a[min];
a[min] = temp;
}
}
}
return a;
}
}
我注意到我的导师编码方式略有不同:
public static int[] selectionSort(int[] a) {
int min;
for (int i = 0; i < a.length - 1; i++) {
min = i;
for (int j = i + 1; j < a.length; j++) {
if (a[j] < a[min]) {
min = j;
}
}
int temp = a[i];
a[i] = a[min];
a[min] = temp;
}
return a;
}
两种实现都有效。我很好奇这里的区别是什么。这是效率吗?
答案 0 :(得分:2)
你的教练和你的教师之间的区别在于他遍历数组并为每个元素搜索最小值,然后在墙索引之后与元素进行交换。
对于你的,你遍历数组和每个元素,同时搜索最小值,如果当前值是&lt;然后是当前的暂定最小值,在墙索引之后与元素进行交换。
因此,对于最坏情况,您可以交换n * n次,而不是交换n次:
你只换一次通过(最糟糕的情况):
100, 90, 88, 70, 55, 43, 32, 28, 19, 10
90, 100, 88, 70, 55, 43, 32, 28, 19, 10
88, 100, 90, 70, 55, 43, 32, 28, 19, 10
70, 100, 90, 88, 55, 43, 32, 28, 19, 10
55, 100, 90, 88, 70, 43, 32, 28, 19, 10
43, 100, 90, 88, 70, 55, 32, 28, 19, 10
32, 100, 90, 88, 70, 55, 43, 28, 19, 10
28, 100, 90, 88, 70, 55, 43, 32, 19, 10
19, 100, 90, 88, 70, 55, 43, 32, 28, 10
10, 100, 90, 88, 70, 55, 43, 32, 28, 19
你的导师交换一次通过(最坏的情况):
100, 90, 88, 70, 55, 43, 32, 28, 19, 10
10, 90, 88, 70, 55, 43, 32, 28, 19, 100
实质上,您在搜索最小值时交换值。您交换的“min”可能不是数组中的最小值。
答案 1 :(得分:1)
包括你的教练代码更高效,更优雅。 什么是选择排序?
算法将输入列表分为两部分:已排序的项目子列表,在列表的前面(左侧)从左到右构建,以及剩余要排序的项目的子列表占用列表的其余部分。最初,排序的子列表为空,未排序的子列表是整个输入列表。 算法通过查找未排序子列表中的最小(或最大,取决于排序顺序)元素,与最左边的未排序元素(将其按排序顺序)交换(交换),并将子列表边界移动一个元素来继续在右边。
如果要排序的列表长度为 n ,则只需 n次交换,但在您的代码中,它是&#39; sn *第(n-1)*(N-2)...